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

ble*_*lex 7 php cookies

由于服务器看不到 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!";
}

?>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

dec*_*eze 6

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

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


小智 6

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

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

我的解决方案是使用以下函数通过 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 "";
    }
Run Code Online (Sandbox Code Playgroud)

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

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