我对跨域 AJAX 请求有疑问。
此问题涉及三台服务器。我们可以称它们为A1、A2和B。
A1和A2运行相同的应用程序代码。它们是同一 Web 应用程序的两个暂存实例。B是另一个网络应用程序。
我们需要执行从A Web 应用程序到B应用程序的跨域 AJAX 请求。我们尝试启用 CORS,但很难让它在 IE <= 8 中令人满意地工作,所以现在我们使用的是 nginx 代理规则。因此流程是:浏览器 ajax 请求 -> A1或A2 -> nginx 代理 -> B
B是有状态的,需要用户的会话 cookie 才能运行。
我们看到的是,这在使用服务器A1时可以正常工作,但是在使用服务器A2时,B无法提取 cookie。
我查看了来自A1和A2的请求的标头,它们是相同的。两者在标题中都有 cookie 行,都具有相同的来源,等等。
在B上,我们看到 $_COOKIE['session_key'] 在请求来自A2时为空,但在请求来自A1时正确填写。
奇怪的是,它只是缺少从标头中的 cookie 中提取一个特定的 cookie 键,并且只有当请求来自A2时。它可以很好地解析来自A2的标头中的所有其他 cookie ,它只是由于某种原因无法解析用户的会话 cookie,但如果请求来自A1就可以了。
我已经使用了 tcpdump 并对其中的每一个进行了 pcaps 并对它们进行了比较,并且标题中的任何内容看起来都没有特别不同。
我发现了这个 Stack Overflow 问题,人们说这是因为他的 cookie 标头字符串太长:What could cause cookie to not be set in $_COOKIE when it's in $_SERVER我不认为那太长,因为我的只有 249 个字符长,在成功和失败的情况下。
我正考虑从 $_SERVER 中提取 cookie 并手动解析它们,但这听起来很愚蠢,我更愿意找出根本问题。