【问题标题】:Cookies not being sent back and forth properly in OperaCookie 未在 Opera 中正确来回发送
【发布时间】:2026-02-07 11:10:01
【问题描述】:

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

我的应用程序在 trigger.io forge 平台上运行,并使用代理将请求从 Web 应用程序路由到服务。代理只是简单地转发请求和 cookie,这在大多数浏览器中都按预期工作。

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

正如您在屏幕上看到的,FF 可以看到 cookie 标头并适当地设置它们,但 Opera 没有。

Firefox Request

Opera request 1 Screen

Opera Request 2 Screen

我没有包含来自代理的代码来进行请求转发,所以如果您需要这些代码以获得一些见解,请告诉我。在服务端,我正在运行 PHP 和 Codeigniter。如果我需要在我的环境中添加更多信息,请告诉我,谢谢。

更新:即使在我不使用自定义 TLD 的生产环境中也会出现此问题。其他使用 cookie 的网站运行良好,并且启用了 cookie。

【问题讨论】:

  • 愚蠢的问题,但是在您的 Opera 安装中启用了 Cookie(设置 > 首选项 > 高级 > Cookie)?如果是这样,您可以考虑在operaprefs.ini 中将Do Not Show Cookie Domain Errors=0 设置在[User Prefs] 下,以查看Opera 是否由于您的私有.locdev TLD 的适当限制级别不确定而拒绝cookie。
  • 我在about:config 中找到了设置并取消勾选,没有解决问题。 Cookie 也已启用,其他网站也可以正常工作。我应该提到即使在我的生产环境中也会发生这种情况,因此不可能是由于 TLD。将在问题中添加该信息,谢谢。
  • 一些初步想法 - Opera 是唯一支持 Set-Cookie2 的浏览器。我不知道这意味着什么,但也许它与问题有关?另一个想法 - 您为 /_forge 路径设置了多少 cookie:Opera 的限制为 30,而 Firefox 的限制为 50,目前尚不清楚新的 cookie 是否会导致旧的 cookie 消失或被拒绝。它的工作方式可能因浏览器而异..
  • @AmirNathoo 将检查 set-cookie2,谢谢。至于数量,我们只有大约 4 - 5 个 cookie。绝对不超过10个,所以也不应该是这样。另外,我在全新安装时检查了它,但仍然失败。

标签: php cookies opera trigger.io


【解决方案1】:

查看那些 Opera 屏幕截图,它们似乎是在同一秒内处理的 AJAX / XHR 请求。 Javascript 是否有可能“同时”触发这两个请求,因此“第一个”的响应在构建“第二个”的请求之前没有到达 - 因此尚未设置 cookie?

我不熟悉您使用的技术/工具包,所以不知道这些是库存代码还是您的自定义应用程序的一部分。

【讨论】:

  • 不,它们不会在同一秒内运行。我已经按顺序设置了。如果您查看响应,您可以看到 cookie 被返回但实际上并未被使用。
  • 那为什么您的两个 Opera 屏幕截图都将响应时间列为“Wed, 08 Aug 2012 17:00:09 GMT”?是的,服务器在两个响应上都设置了 cookie,但是如果浏览器在看到第一个响应之前创建了第二个请求,那么它当然不会发回这些 cookie。
  • 好点,但我检查了它,这似乎没有什么区别。我将第二个请求延迟了 2 秒,但还是一样。这是从本地设置中获取的,这就是时间戳如此接近的原因。我可以向你保证,代码是按顺序运行的。
  • 很公平。这是一个基于所提供证据的合理理论,所以我很高兴你已经通过实验排除了它。
【解决方案2】:

双引号在 cookie 值中是非法的。如果您将它们转义为 %22,它将起作用。

【讨论】:

  • 我将尝试深入研究代理的代码以确认这一点,但如果是这种情况,它不会影响其他所有浏览器吗?
  • 我浏览了代理代码并切换了一些东西。删除双引号并放入替换字符就像一个魅力!谢谢!
【解决方案3】:

您是否检查过这是否是 cookie 域的问题?我假设您正在使用 Javascript 来设置/读取 cookie?无论如何,您可能需要检查 4 个 cookie 域问题(我知道我在旧 FF 版本中遇到过这些问题):

1 - 检查非法 cookie 字符:allowed cookie characters 您可能不允许在 cookie 名称中使用“-”或“=”,并且您根本不应该在 cookie 中使用非 ASCII 字符。 base64 编码可能会处理这个问题。

2 - 检查您设置 cookie 的域(通过 javascript 代码或任何其他方式)与执行代码的域相同。

3 - 检查 cookie 域是否不是 localhost;看看你是否可以测试从远程域设置 cookie

4 - 如果您使用 JS 设置 cookie,请尝试测试您是否可以在浏览器中使用 CGI 设置 cookie,以确保这不是浏览器问题。如果它应该有效,请查看您是否可以使用 JS 读取 cookie(而不是设置它)。

让我知道这在 cmets 中是如何发生的,我已经多次处理过类似的问题,并且根据您通过这些检查得到的结果,我很确定我可以帮助您解决问题。

【讨论】:

  • cookie 是由 PHP codeigniter 设置的,它似乎正在对其进行编码,因此应该是干净的。域是相同的。我的实时服务器上有这个问题。而且我的本地服务器没有命名为 localhost。似乎正在通过的唯一 cookie 是由 JS 设置的那些。 PHP cookie 似乎不起作用。顺便说一句,这只会在 Opera 上中断。其他一切正常。
  • 有多种原因可能导致此问题:您是否检查过没有事先发送标头?也许在执行 cookie 代码之前会抛出一个隐藏的 PHP 通知?
  • 这可能不是这种情况,但您能否确认如果您创建一个仅包含 cookie 内容的新 php 文件,该 cookie 仍然没有在 Opera 中设置?另外,您能否在您的 php.ini 文件中包含 cookie 设置?您可能想隐藏确切的域名和此类敏感信息...
  • 查看我对双引号的回答。我已经在多个浏览器上对此进行了测试,我知道这是问题的原因。
  • @JohnP 我很害怕...代理域与设置 cookie 的域相同吗?你可以尝试直接从代理设置cookie吗?