【问题标题】:Cookies cannot be set the first time after clearing history in Firefox在 Firefox 中清除历史记录后第一次无法设置 Cookie
【发布时间】:2012-10-05 17:25:33
【问题描述】:

我正在尝试使用 PHP 中的 cookie 设置会话管理。 我的代码如下:

  if(empty($_COOKIE )) {
    setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT));
  }
  $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0;

然后,我将检查 session_id 是否为 0,如果 cookie 被禁用,则打印一条错误消息。 如果 cookie 真的被禁用了,这很好用。

问题是,如果用户在第一次访问时清除了他的历史记录 即使启用了 cookie,他也会收到错误消息的站点。

有人对此有任何线索吗? 提前谢谢你

【问题讨论】:

    标签: php session cookies


    【解决方案1】:

    当您调用 setcookie 时,cookie 将在标头输出到浏览器时发送。这意味着 cookie 在下一个页面加载之前不可用(当客户端将 cookie 发送回服务器时)。这在 setcookie http://php.net/manual/en/function.setcookie.php 的 php 手册中有所提及:

    setcookie() 定义了一个 cookie 与其余的 HTTP 标头一起发送。与其他标头一样,必须在脚本的任何输出之前发送 cookie(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。

    一旦设置了 cookie,就可以在 下一页加载时使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。注意,像 $_COOKIE 这样的超全局变量在 PHP 4.1.0 中可用。 Cookie 值也存在于 $_REQUEST 中。

    在页面重新加载(来自 php)之前,您将无法确定是否启用/禁用了 cookie。我认为您必须使用 javascript 进行此检查,或者在第一次设置 cookie 后留在 php 中进行重定向,例如:

        if(empty($_COOKIE)) {
                if (isset($_GET['cookieset'])) {
                        // do error message, cookie should be set
                }
                setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT));
                header('location: http://mysite.com/index.php?cookieset=1');
                exit;
        }
        $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0;
    

    【讨论】:

    • 这样做的问题是,如果禁用 cookie,用户将始终被重定向到 index.php - 因此陷入循环。有没有不使用 $_GET 变量的检查?
    • 您不必重定向到 index.php,您可以使用 $_SERVER['REQUEST_URI'] 重定向到当前页面以获取用户当前所在的页面。或者我说过要放置错误的地方,您可以重定向到另一个显示错误的页面,或者显示错误并停止处理。这取决于你想做什么。
    【解决方案2】:

    @bencoder : 我已经在 iPad 和 Chrome/PC 上进行了测试:你是适合 iPad 的,你确实需要刷新页面才能读取 cookie 数据,但在 Chrome/PC 上,删除所有 cookie 后,如果你从 PHP 设置一个新的,你可以直接在第一页加载时完美地获取值。为什么 ?必须有更准确的解释。为什么会有两种不同的行为?此输出/数据可用性的顺序是否取决于浏览器对服务器的请求?有兴趣知道...

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多