我有一个项目在本地服务器上工作,但在我的生产服务器上不起作用,因为服务器看不到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()函数检查您的时间,并与当地时间进行比较。也许其中一个是错的。