Php 一些用户可以';t登录;其他人可以登录,但可以';不要提交表格

Php 一些用户可以';t登录;其他人可以登录,但可以';不要提交表格,php,session,caching,cookies,login,Php,Session,Caching,Cookies,Login,我运行一个站点,用户偶尔会联系我,因为他们要么无法登录,要么可以登录,但提交表单时遇到问题(表单位于受保护的页面上,使用PHP会话)。到目前为止,我一直能够告诉用户只需切换浏览器,问题就解决了:我认为这是某种浏览器问题,因为并不是每个用户都有这个问题。此外,所有有问题的用户都在使用IE。我当时认为这可能是IE特有的问题,直到新用户在Chrome/Firefox上出现同样的问题(我在两台不同的机器上登录了用户帐户,无法复制Chrome/Firefox问题) 在做了一些挖掘之后,我现在认为问题可能与

我运行一个站点,用户偶尔会联系我,因为他们要么无法登录,要么可以登录,但提交表单时遇到问题(表单位于受保护的页面上,使用PHP会话)。到目前为止,我一直能够告诉用户只需切换浏览器,问题就解决了:我认为这是某种浏览器问题,因为并不是每个用户都有这个问题。此外,所有有问题的用户都在使用IE。我当时认为这可能是IE特有的问题,直到新用户在Chrome/Firefox上出现同样的问题(我在两台不同的机器上登录了用户帐户,无法复制Chrome/Firefox问题)

在做了一些挖掘之后,我现在认为问题可能与会话有关。他说:

在访问支付门户或购物车等安全区域之前,还需要清除旧的缓存文件和cookie。如果旧的浏览器缓存和cookie未被废弃,“会话已过期”是常见的通知

在进一步挖掘Stackoverflow之后,我发现了一个由@BalusC开始的例子,他说避免通过php缓存页面的正确方法是使用:

header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.
考虑到上述情况,我有几个问题:

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

    编辑:

    我的登录页面如下:

    <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>
    
    
    用户名:
    密码:
    
    我认为这也可能是javascript问题,有时javascript可能在chrome或IE上被禁用。您可以尝试禁用javascript,看看会发生什么。您只能在登录页面上添加无缓存。虽然我已经测试过NO_缓存,但它似乎并不总是有效


    在您的登录页面上有javascript验证还是php验证?

    我也运行了一个网站,允许用户登录和浏览受保护的页面。就我个人而言,我在这个过程中使用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=“。时间()

    这似乎有效地阻止了缓存,因为页面本身发送的消息基本上是“不要缓存我!”并且每个链接都是一个新的唯一链接

    CloudFlare可以影响缓存,因为它们可以流回页面的缓存副本;但是,我相信这在CloudFlare设置中是可以调整的(尽管我不是100%确定)


    编辑:

    以下是有关PHP缓存控制的一些详细信息:

    感谢您的快速回复。我可以向您发送一个PHP登录代码,它的工作原理类似于windows域控制器。因此,为了保护页面,只需添加include('system_load.php');验证用户(“用户组”);我很感激这个提议,但是我已经创建了自己的登录代码,除了零星的用户之外,它工作得很好;当然,了解这里目前的情况会很有帮助。因为课程等原因,这有点牵扯其中。感谢您的回复!而且,您是否可以将PHP标题放在登录页面上?我当然希望在我的网站上缓存js和css等资产。或者,标题必须出现在每个受保护的页面上,从而破坏我的其他资产的缓存?我个人将此标题放在所有地方,但我的Web服务器根本没有缓存。您可以缓存页面,然后使用PHP来流式处理样式表/javascript/等。您也可以采用Yahoo方法。Yahoo返回所有HTML,但他们说“我们的css\u name\u v0\u 0\u 0.css”,因此,例如,“outputStyles\u v1\u 0\u 2.css”,然后他们的下一次更新样式表名称更改为“outputStyles\u v1\u 0\u 3.css”(或任何版本)。然而,我相信使用PHP流式返回css/javascript是一个更可行的解决方案。也许我需要备份一分钟……我所有的页面都有.PHP扩展名,所以我认为这意味着我的html没有被缓存(这很好)。我的资产(js/css)通过Cloudflare缓存;我并不担心我的更新会过时,因为Cloudflare中有一个“清除缓存”选项可以刷新这些资产。但是,我担心cookie(phpsessid)可能会以某种方式被缓存,从而导致我的一些用户出现登录问题。那么,添加php头是否可以防止cookie出现问题?它会阻止缓存资产吗?两者都有?添加此选项不会阻止Cookie。Cookie会一直保存到过期。浏览器不应该存储或提交过期的cookie。Cookie和Cache实际上是两个独立的东西。一个是存储的服务器响应(或者更确切地说,只是所述响应的内容),而cookie是存储的服务器变量。一方面,缓存被接收,并且永远不会传输回服务器。另一方面,cookie会随着每个相关http(s)请求被接收并传输回服务器。(在下一篇评论中继续)嘿,Eric,为了帮助我和其他成员,您是否收集了关于遇到错误的用户的任何其他数据(浏览器类型、版本、操作系统、上次登录时间等)?我开始寻找记录浏览器、版本等的方法。,但了解确切的浏览器似乎是一个不完美的过程。然而,除了最后一个用户之外,所有人都告诉我他们正在使用IE,一个简单的浏览器更改就成功了。我也开始在谷歌上搜索“登录问题”,很多网站基本上都说用户应该清除他们的浏览器cookie——这似乎表明我对此无能为力。一个例子是:。所以