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

时间:2016-09-23 12:43:29

标签: 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!";
}

?>

无论我多少次刷新此页面,我总是得到&#34;未找到&#34;信息。每当我尝试记录$_COOKIE变量时,我都会得到一个空数组。但是:

  • Cookie存在于浏览器中,并随请求正确发送
  • Cookie已设置并在同一个文件中读取(path不是问题)
  • setcookie之前没有输出,文件以UTF8编码而没有BOM

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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值的情况下的其他选择。

答案 2 :(得分:0)

我遇到过类似的问题,结果发现是HAProxy配置问题。您在服务器和用户之间是否有任何负载均衡器?

答案 3 :(得分:-1)

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