【问题标题】:Cookie is present in browser, but php $_COOKIE is emptyCookie 存在于浏览器中,但 php $_COOKIE 为空
【发布时间】:2019-04-25 01:31:11
【问题描述】:

我有一个项目可以在本地服务器上运行,但不能在我的生产服务器上运行,因为服务器看不到 cookie。我已经制作了在该服务器上重现该问题的代码的最小版本:

<?php

if(!isset($_COOKIE['foo'])){
    setcookie('foo', 'bar', time() + 7*24*60*60, '/');
    echo "Cookie was not found, so we just created it.";
} else {
    echo "Cookie was found!";
}

?>

无论我刷新此页面多少次,我总是收到“未找到”消息。每当我尝试记录 $_COOKIE 变量时,我都会得到一个空数组。然而:

  • cookie 存在于浏览器中,并与请求一起正确发送
  • cookie 在同一个文件中设置和读取(path 没有问题)
  • setcookie之前没有输出,文件用UTF8编码,没有BOM

我认为这是服务器配置问题,因为代码在本地工作,但我不知道去哪里找。有没有人见过这种情况,你知道是什么原因造成的吗?

如果您需要更多信息,请告诉我,我会将其添加到我的问题中。谢谢!

【问题讨论】:

  • 任何 CDN 和/或缓存服务器吞下 cookie...?
  • 检查服务器的 php.ini 中是否有 variables_order 指令。是否缺少Cphp.net/manual/en/ini.core.php#ini.variables-order
  • @deceze 有一个 Varnish 缓存设置,但是这个页面没有被缓存。你认为那能吞下饼干吗? @Michael,谢谢你的建议,我查过了,好像没问题:variables_order = EGPCS
  • 缓存服务器通常不会默认通过 cookie,除非您明确将它们列入白名单。
  • @deceze 我和一位同事谈过关于 Varnish 的事,他和你说了同样的话:它会根据白名单过滤 cookie。感谢您的帮助,请将其作为答案发布,以便我接受:)

标签: php cookies


【解决方案1】:

如果涉及缓存服务器或 CDN,它可能会根据白名单过滤 cookie。这是为了改进缓存,因为每个带有唯一 cookie 集的请求都需要被视为与其他请求不同并且不能被缓存(您可能会根据您的 cookie 从服务器收到不同的回复,因此缓存服务器无法为您提供前一个客户端的缓存响应)。由于许多服务都在设置 cookie,这些 cookie 可能会发送到服务器(例如分析包),但对响应的内容绝对没有影响,默认情况下注意所有 cookie 通常会完全破坏缓存。

配置负责的缓存服务器以特别注意您的 cookie 并将其转发到源服务器。如果您有很多不同的 cookie,请考虑为它们提供一个通用前缀和白名单(例如 foo-*)。

【讨论】:

  • 很好的解释。另外,感谢您提供有关前缀的提示,这可能对我有帮助,以避免每次我需要新 cookie 时都询问我的同事。
【解决方案2】:

我刚刚处理了同样的问题,我的生产服务器允许我使用 setcookie('cookieNameHere', $cookieValueHere, time() + (86400 * 365), "/") 创建浏览器 cookie,但 $_COOKIE 变量始终是一个空数组。

问题是我的生产服务器出于安全原因阻止了通过 PHP 直接访问$_COOKIE 变量内容。

我的解决方案是使用以下函数通过 JavaScript 访问 cookie 值:

    function getCookie(cname) {
      var name = cname + "=";
      var decodedCookie = decodeURIComponent(document.cookie);
      var ca = decodedCookie.split(';');
      for(var i = 0; i <ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
          c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
          return c.substring(name.length, c.length);
        }
      }
      return "";
    }

我继续通过 PHP 创建/更新 cookie。

仅供参考,我正在开发一个托管在 WP-Engine 上的 WordPress 网站。请参阅this page 以获得深入的解释,以及在您绝对需要通过 PHP(ADMIN-AJAX 调用等)访问 cookie 值的情况下的其他选项。

【讨论】:

    【解决方案3】:

    我也遇到过类似的问题,原来是 HAProxy 配置问题。服务器和用户之间有负载均衡器吗?

    【讨论】:

    • 感谢您的意见,可能是这样,我会问我的同事。
    【解决方案4】:

    我认为你的问题是服务器时间。使用 time() 函数检查您的时间并与本地时间进行比较。也许其中一个是错误的。

    【讨论】:

    • 谢谢你的回答,不过我查了时间,和我的机器是一样的
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2016-07-29
    相关资源
    最近更新 更多