Cookie存在于浏览器中,但php $_COOKIE为空


Cookie is present in browser, but php $_COOKIE is empty

我有一个项目在本地服务器上工作,但在我的生产服务器上不起作用,因为服务器看不到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。这是为了改进缓存,因为每个具有唯一cookie集的请求都需要被视为与其他请求不同,并且不能被缓存(您可能会根据您的cookie从服务器收到不同的回复,因此缓存服务器无法为您提供先前客户机的缓存响应)。由于许多服务都在设置cookie,这些cookie可能会发送到服务器(例如分析包),但对响应的内容绝对没有影响,因此默认情况下注意所有cookie通常会完全破坏缓存。

配置负责缓存的服务器专门关注您的cookie并将其转发到原始服务器。如果您有很多不同的cookie,请考虑给它们一个共同的前缀和白名单(例如foo-*)。

我刚刚处理了同样的问题,我的生产服务器允许我使用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。

仅供参考,我在一个WordPress网站托管WP-Engine。如果你需要通过PHP (ADMIN-AJAX调用等)访问cookie值,请参阅本页以获得更深入的解释,以及其他选项。

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

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