9

我对跨域 AJAX 请求有疑问。

此问题涉及三台服务器。我们可以称它们为A1A2B

A1A2运行相同的应用程序代码。它们是同一 Web 应用程序的两个暂存实例。B是另一个网络应用程序。

我们需要执行从A Web 应用程序到B应用程序的跨域 AJAX 请求。我们尝试启用 CORS,但很难让它在 IE <= 8 中令人满意地工作,所以现在我们使用的是 nginx 代理规则。因此流程是:浏览器 ajax 请求 -> A1A2 -> nginx 代理 -> B

B是有状态的,需要用户的会话 cookie 才能运行。

我们看到的是,这在使用服务器A1时可以正常工作,但是在使用服务器A2时,B无法提取 cookie。

我查看了来自A1A2的请求的标头,它们是相同的。两者在标题中都有 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 并手动解析它们,但这听起来很愚蠢,我更愿意找出根本问题。

4

4 回答 4

0

PHP在这里没有错。

我们使用的是 Kohana,它在初始化时运行了一些代码,以尝试为会话 cookie 添加额外的安全性。有问题的代码验证了服务器端会话中记录的 IP 地址与请求标头中发送的 IP 地址相匹配。

由于我们的网络配置,我在联系服务器 B 时总是收到一个外部 IP,在联系 A2 时收到一个内部 IP,在联系 A1 时收到一个外部 IP。

当 A2 将带有内部 IP 的请求转发给 B 时,它触发了 Kohana 的基于 IP 的 cookie 保护,因为 cookie 是使用我的外部 IP 创建的,但现在试图由我的内部 IP 使用。

于 2013-02-01T15:44:52.820 回答
0

使用 IE<=8 时的一个问题是P3P。我发现将 P3P 标头放入接受 AJAX/JSON 请求的页面(您的实例中的服务器 B)将解决此问题:

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

至于server A2 不向 发送$_COOKIE请求server B,我建议使用 将请求发送_GET到某种init页面server B。通过这种方式,它可以被处理并存储在server B. 然后对于必须存在此信息的所有剩余页面,您可以查看server B确定信息是否已发送,或连续将_GET数据发送到每个页面并将其与现有信息进行比较。提醒一下,应严格监控此信息,因为它更容易修改。

抱歉,我意识到这并不能解决问题,但可以提供替代解决方案。

于 2013-01-31T16:20:26.067 回答
0

前段时间,我不得不做跨域ajax请求。显然,当我尝试使用 IE 将标头设置为“允许 x-domain ajax”时遇到了同样的问题(不记得确切的标头名称)。

我所做的就是在服务器的 ajax 之间使用 CURL。因此,通过这种方式,我的 ajax 脚本(用 PHP 编写)能够通过 JSON + CURL 通过服务器交换数据,通过 CURL POST 发送数据,并通过 CURL GET 检索数据,无论涉及哪些域。

请原谅,也许这不是您需要的答案,但是,IMO,这可以帮助寻找跨站点 ajax 的人。

于 2013-02-20T14:45:37.927 回答
0

在服务器之间使用 GET;就这样。并建立一种方法来对 get 进行哈希处理,这样如果服务器无法完成请求,用户就不会看到拉取的实际 cookie 内容

于 2013-05-06T20:29:12.100 回答