有些用户无法登录;其他人可以登录但不能提交表格

时间:2014-09-18 14:37:15

标签: php session caching cookies login

我运行一个网站,偶尔用户会联系我,因为他们要么无法登录,要么可以登录但是提交表单有问题(表单在受保护的页面上,使用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.

考虑到上述情况,我有几个问题:

  1. 我会将上述代码放在登录屏幕上吗?在我看来,如果我把它放在用户登录的任何页面上,那么它们将被注销,因为会话不会被缓存。
  2. 如果我使用CDN(CLoudflare),他们的缓存过程会覆盖我在特定页面上写的内容吗?
  3. 谢谢!

    编辑:

    我的登录页面如下:

    <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>
    

2 个答案:

答案 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验证?