我运行一个网站,偶尔用户会联系我,因为他们要么无法登录,要么可以登录但是提交表单有问题(表单在受保护的页面上,使用PHP会话)。到目前为止,我已经能够告诉用户只需切换浏览器,问题就解决了:我认为这是某种浏览器问题,因为不是每个用户都有这个问题。此外,所有问题用户都在使用IE。然后我认为这可能是IE特定的问题,直到新用户在Chrome / Firefox上遇到相同的问题(我在两台不同的计算机上登录了用户帐户,但无法复制Chrome / Firefox问题)。
在做了一些挖掘之后,我现在认为问题可能与会话有关。 This site说:
在访问支付门户或购物车等安全区域之前,还需要清除较旧的缓存文件和Cookie。如果旧的浏览器缓存和cookie没有被废弃,“会话已过期”是一种常见的通知。
在对Stackoverflow进行进一步挖掘之后,我发现@BalusC启动了一个community wiki,说通过php避免缓存页面的正确方法是使用:
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.
考虑到上述情况,我有几个问题:
谢谢!
编辑:
我的登录页面如下:
<div id="login_form">
<form id="login" method="post">
<?php $login_problem = FALSE;
if (isset($_POST['signin']) && $failed) {
$login_problem = TRUE;
$login_error_result ='<a href="/admin/forgotten.php">Forget something?</a>';
}
?>
<table>
<tr>
<td>
<label for="username">Username:</label>
<input name="username" id="username" type="text" maxlength="15" />
</td>
<td colspan="2"><label for="password">Password: <?php if ($login_problem) {
echo $login_error_result;}?></label>
<input type="password" id="password" name="password" maxlength="15"/>
</td>
<td id="login_submit" >
<input type="submit" name="signin" class="submit" value="Sign in!" />
</td>
</tr>
</table>
</form>
</div>
答案 0 :(得分:1)
我也运行一个允许用户登录和导航受保护页面的网站。我个人使用cookie进行处理,但PHP会话本质上是一个名为phpsessid
的cookie。以下是我用来阻止缓存的PHP标头:
header("Cache-control: no-store, no-cache, must-revalidate");
header("Expires: Mon, 26 Jun 1997 05:00:00 GMT");
header("Pragma: no-cache");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
在为网站导航写出我的锚标签时,我使用echo "$anchorTagLink?cacheBuster=" . time();
这似乎有效地防止了缓存,因为页面本身发送的消息基本上是“不要缓存我!”每个链接都是一个新的独特链接。
CloudFlare可以影响缓存,因为它们可以流回页面的缓存副本;但是,我相信这可以在CloudFlare设置中调整(虽然我不是100%肯定)。
编辑:
以下是有关PHP缓存控制的一些细节: http://css-tricks.com/snippets/php/intelligent-php-cache-control/
答案 1 :(得分:0)
我认为这也可能是一个javascript问题,有时可能会在Chrome或IE上禁用javascript。你可以尝试禁用javascript,看看会发生什么。您只能在登录页面上添加NO-CACHE。虽然我已经测试了NO_Cache但它似乎总是起作用。
在您的登录页面上,您是否有javascript验证或php验证?