当它在$ _SERVER中时,什么可能导致$ _COOKIE中没有设置cookie

时间:2011-07-16 01:23:22

标签: php cookies

我已经设置了一个cookie,并且cookie位于请求标头中,但是当我在PHP超全局$_COOKIE中访问该cookie时,它没有设置。转储$_COOKIE显示其他cookie但只有一个,所有都在请求标题中。

如果我转储$_SERVER,我可以在$_SERVER['HTTP_COOKIE']中看到该Cookie。 PHP将所有cookie设置为$_COOKIE但只有一个。

可能导致这种情况的原因是什么?

服务器正在运行PHP 5.3.3。

更新: 在我的index.php的顶部,我var_dump($_SERVER);,然后在下一行var_dump($_COOKIE);,并且不会从第二个转储中打印出预期的cookie。

UPDATE2:

这是我的请求的Cookie部分

Cookie:SESSe00cd0d8b79da0906c77d52ed6e26907=2f9fhsomr2skcfmivagb1i8gj7; __utma=172891446.852439441.1310775539.1310775539.1310775539.1; __utmc=172891446; __utmv=172891446.%3A; __utmb=172891446.4.10.1310780296; OATMEAL=%9Ey%EE%C9J%956%C0%06%B3%EBZ%83%D1%80%C0%AC%D2%D0T%86%9A%2A%2A%A2E%B7f%86%D7i%C1%28%19L%1Fl%920%3CE%10%B6%C9c%1D%E3%A7H%D9%E1%29%1C%7E5%C8q%CC3%21C%0C%DC%CC%A5%F3i%10%F7%DCJjF%EE%B9%80%3C%C6Jy%A2%0E%3F%E3%BD%7B%BF%CD%84%85%91%BB3%B9%EA%CB%92%89%AC%FBc%BA%A32s%B5L%3E%DF%9B%CDk%08%DEZ%13%5Da1Q%B0%1CJ%90%AE%AF%3F%15%98%1B%E1%C1g%A9%BBzR%F5Q%82%8F%81%1A%D1%0E%87%DC%F3%3B%FF%B7%8E%09%0F%BF%DFK%A3t%D1%F3%DA_%ECKt%01%00x%D2%CCE%24%BB0%C2w%B4%82%F0Q%00O%F1v%19%11%0A%3A%BB%9Fy%B1%BC9hgy%C4%DC%DEN%C4%A4%3B%7D%E8%84h%07%E3+%0B%85y%8B%B5y%1B%FC%CE%86B%F55%ED%E0%01%EB%18%13%B0%09%CA%F9%3D%26%05%FC%A7%F8%E4%CD%3C%9E%D7%24%B1%BF%27t%B4%3C%89%D76%F0%CF%C0%D4%E7Z%A6%02%19j%D7%60%28%82%DF%DF%9C%05%25%CB%CA%04%B9%21N%D2r%A76%DD%D1%CB%97%B0%A9%13%29%3C%D6kdm%D1%14%EA%D4%1Fz%F9%CF%21i%BD%19RN%C3%8Dh%27R%15%99%13%FAv%13%8F%BBd%7B%F5%AD%D5%22%13q%13Z%F219%B9%B0_%AB%16%7B%D2%18%E3%F0%F6%9D%A4X

删除的cookie名为“OATMEAL”。

Update3:这个PHP错误听起来类似于https://bugs.php.net/bug.php?id=52018

5 个答案:

答案 0 :(得分:3)

您的字符串长度为1099个字符。

Cookie的最大长度为4Kb。

假设每个字符有4个字节的UTF-8字符,你应该可以存储在1024之间。

尝试将OATMEAL缩小。更小,让我们知道这是否是罪魁祸首。

答案 1 :(得分:1)

您不应该使用$_SERVER["HTTP_COOKIE"]中的值。 It's not documented,所以它可能不可靠。

对于setcookie函数的评论中的

This message可能会回答您的问题。

  

请注意,$ _COOKIE变量不会包含多个具有相同名称的Cookie。 ...

答案 2 :(得分:0)

你可能没有为cookie设置正确的路径吗?我之前遇到过这个问题,它不允许我访问cookie,因为它被自动设置为一个奇怪的路径。我设置cookie时必须指定正确的路径。

你可能已经知道这一点,但有时事情可能隐藏在我们的鼻子底下。

http://us3.php.net/manual/en/function.setcookie.php

欢呼声, 迈克尔

答案 3 :(得分:0)

正如其他人已经说过的那样,几乎可以肯定的是你的cookie字符串的长度。你应该缩短它。

值得指出的是,即使它有效,也有一个很好的理由没有这么长的cookie字符串 - 整个cookie字符串会在你发出的每个HTTP请求的两个方向上发送。

假设您有一个典型的页面,它加载了20个图像,两个CSS文件和两个Javascript文件,以及主HTML页面本身。对于像您这样的1K cookie字符串,对于每个页面加载,这将是服务器带宽(和用户带宽)的额外50K。如果你有合理的流量,这会很快加起来,如果你有任何限制或计量你的带宽,那么你将花费额外的钱。

其次,我不知道OATMEAL cookie包含什么;我没有时间对其进行解码,但它看起来很像是在混淆数据(包括添加一些故意的剧透字符)。请注意,如果此数据足够敏感以至于需要进行模糊处理,那么cookie就是存储它的真正不好的地方。

如果您确实需要将该数量的数据传递给服务器,则应该在POST请求中发送它。如果PHP程序需要通过后续页面加载来访问它,那么将其设置在$_SESSION数组中。如果您的Javascript代码需要能够使用它或设置它,那么请使用Ajax请求。

答案 4 :(得分:0)

谢谢大家,但是从这个线程离线,另一个dev建议在发送时对base64编码cookie数据。这工作并保持数据存活,我能够在服务器端解码并继续。