Opera浏览器中Cookie未正确发送和接收

19

首先,我不确定这是否是Opera 12.01的问题,但问题仅在Opera中发生。我在FF14、Chrome 21、Safari 5(Windows)、Safari Mac以及Android和iPhone上的Webkit浏览器中进行了测试。

我的应用程序运行在trigger.io forge平台上,并使用代理将请求从Web应用程序路由到服务。代理仅转发请求和cookie,大多数浏览器中都能正常工作。

在检查dragonfly中的请求后,我注意到服务器在响应中发送了正确的标头,但似乎Opera忽略了设置值。我想知道这是否是由于cookie的路径值设置错误所致。我附加了Firefox和Opera的2个请求的屏幕截图。

正如您在屏幕截图中看到的那样,Firefox看到cookie标头并适当地设置它们,但是Opera没有。

Firefox请求

Firefox请求

Opera请求1屏幕

Opera请求1

Opera请求2屏幕

Opera请求2

我没有包含执行请求转发的代理代码,因此如果您需要了解相关信息,请告诉我。在服务端,我正在运行PHP和Codeigniter。如果需要在我的环境中添加更多信息,请告诉我,谢谢。

更新:该问题甚至出现在我的生产环境中,该环境未使用自定义顶级域名。其他使用cookie的网站正常工作且启用了cookie。


有点愚蠢的问题,但是您的Opera安装中启用了cookie吗(设置>首选项>高级>Cookie)?如果是这样,您可以考虑在operaprefs.ini中的[User Prefs]下设置“不显示Cookie域错误=0”,以查看Opera是否由于对私有.locdev TLD的适当限制级别存在不确定性而拒绝了该cookie。 - eggyal
2
我在“about:config”中找到了设置并取消了勾选,但问题仍未解决。Cookie也已启用,其他网站正常工作。我应该提到即使在我的生产环境中也会出现这种情况,因此不能归咎于顶级域名。将此信息添加到问题中,谢谢。 - JohnP
几个最初的想法 - Opera是唯一支持Set-Cookie2的浏览器。我不知道这是否与问题有关?另一个想法 - 您在/_forge路径下设置了多少个cookie:Opera限制为30,而Firefox限制为50,不清楚新cookie是否会导致旧cookie消失或仅被拒绝。这样的工作方式可能因浏览器而异... - Amir Nathoo
@AmirNathoo 会检查 set-cookie2,谢谢。至于数量,我们只有大约4-5个cookie。绝对不会超过10个,所以这也不应该是问题。此外,我在干净的安装上进行了检查,但仍然失败。 - JohnP
4个回答

8

双引号在cookie值中是非法的。如果你将它们转义为%22,它就能正常工作。


我会尝试深入了解代理的代码以确认这一点,但如果是这样的话,难道不会影响到其他所有浏览器吗? - JohnP
我仔细查看了代理代码并进行了一些修改。去掉双引号并替换为其他字符非常有效!谢谢! - JohnP

5
您是否检查过这是否与Cookie域有关? 假设您正在使用Javascript设置/读取Cookie? 无论如何,这里有4个Cookie域问题需要检查(我知道我曾经遇到过一个旧版本的Firefox):
1- 检查非法Cookie字符:允许使用的Cookie字符 您可能不允许在Cookie名称中使用“ - ”或“ = ”,且根本不应在Cookie中使用非ASCII字符。 base64编码可以解决此问题。
2- 检查通过JavaScript代码或其他任何方式设置Cookie的域与执行代码的域相同。
3- 检查Cookie域不是localhost; 看看是否可以从远程域设置Cookie 4- 如果您正在使用JS设置Cookie,请尝试使用浏览器中的CGI测试是否可以设置Cookie,以确保不是浏览器问题。 如果它起作用(应该是这样),请尝试使用JS读取Cookie(而不是设置Cookie)。
请在评论中告诉我这些检查的情况,我曾多次处理类似问题,根据您得到的结果,我相信我可以帮助您解决问题。

可能有多种原因导致这种情况发生:您是否检查过头信息是否在执行 cookie 代码之前发送?也许在 cookie 代码执行之前会抛出隐藏的 PHP 注意事项? - Cosmin Atanasiu
1
这可能不是情况,但您能否确认一下,如果您创建一个仅包含cookie内容的新php文件,该cookie是否仍未在Opera中设置?另外,请在您的php.ini文件中包含cookie设置。您可能希望隐藏确切的域名和敏感信息... - Cosmin Atanasiu
1
请查看我的关于双引号的回答。我已经在多个浏览器上进行了测试,我知道这是问题的原因。 - hallvors
1
@JohnP 我就怕这个...代理域名和设置cookie的域名是一样的吗?你能否尝试直接从代理处设置cookie? - Cosmin Atanasiu
@CosminAtanasiu 感谢您的帮助,用户hallvors的回复关于删除双引号已经为我解决了问题 :) - JohnP
显示剩余6条评论

0
你有检查过在setcookie中的cookie域名的“前导点”形式吗?我已经使用前导点多年了,最近才注意到我的应用程序无法在Opera(Chromium等)上设置cookie,因为前导点是RFC的一部分。在Opera中,不是忽略前导点,而是根本没有设置cookie。我已经删除了前导点,现在它可以工作了。

-1
看着那些 Opera 的截图,它们似乎是 AJAX / XHR 请求,在同一秒内处理完毕。Javascript 是否可能同时触发这两个请求,因此“第一个”响应在“第二个”请求构造之前尚未到达,因此 cookie 尚未设置?
我不熟悉您使用的技术/工具包,因此不知道这些是标准代码还是您自定义应用程序的一部分。

不,它们不会在同一秒内运行。我已经按顺序设置好了。如果你看一下响应,你可以看到返回的 cookie 但实际上并没有被使用。 - JohnP
那么为什么你的Opera截图都将响应时间列为“2012年8月8日星期三17:00:09 GMT”?是的,服务器在两个响应中都设置了cookie,但如果浏览器在看到第一个响应之前创建了第二个请求,那么它当然不会将这些cookie发送回去。 - IMSoP
好的观点,但我已经检查过了,似乎没有什么区别。我将第二个请求延迟了2秒,但结果还是一样。这是从本地设置中获取的截图,所以时间戳非常接近。我可以保证代码是按顺序运行的。 - JohnP
1
很好。基于所提供的证据,这是一个合理的理论,所以我很高兴你已经通过实验排除了它。 - IMSoP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接