繁体   English   中英

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,请考虑给它们提供通用的前缀和白名单(例如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。

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

我遇到过类似的问题,事实证明这是HAProxy配置问题。 服务器和用户之间是否有任何负载平衡器?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM