我遇到跨域AJAX请求的问题。
此问题涉及三台服务器。我们可以称之为 A1 , A2 和 B 。
A1 和 A2 正在运行相同的应用程序代码。它们是同一Web应用程序的两个临时实例。 B 是另一个网络应用程序。
我们需要执行从 A Web应用程序到 B 应用程序的跨域AJAX请求。我们尝试启用CORS但很难在IE< = 8中令人满意地工作,所以现在我们使用的是nginx代理规则。因此,流程是:浏览器ajax请求 - > A1 或 A2 - > nginx proxied - >的乙
B 是有状态的,需要用户的会话cookie才能运行。
我们看到的是,当使用服务器 A1 时,此功能正常,但使用服务器 A2 时, B 无法提取出饼干。
我查看了来自 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并手动解析它们,但这听起来很愚蠢,我更愿意找出根本问题。
答案 0 :(得分: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
1}}。这样它就可以被处理,并存储在server B
上。然后,对于必须存在此信息的所有其余页面,您可以查看_GET
以确定信息是否已发送,或者将{{1}}数据连续发送到每个页面并将其与已有信息进行比较手上。提醒一下,应严格监控此信息,因为它更容易修改。
我道歉,我意识到这不能解决问题,但可以提供替代解决方案。
答案 1 :(得分:0)
PHP在这里没有错。
我们使用的是Kohana,它在初始化时运行了一些代码,试图为会话cookie添加额外的安全性。有问题的代码验证了服务器端会话中记录的IP地址与请求头中发送的IP地址匹配。
由于我们的网络配置,我在联系服务器B时始终收到外部IP,在联系A2时收到内部IP,在联系A1时收到外部IP。
当A2将请求与内部IP转发给B时,它触发了Kohana的基于IP的cookie保护,因为cookie是使用我的外部IP创建的,但现在尝试被我的内部IP使用。
答案 2 :(得分:0)
前段时间,我不得不做跨域ajax请求。显然,当我尝试使用IE设置标题“允许x-domain ajax”(不记得标题名称)时,我遇到了同样的问题。
我做了这个排序,是在服务器的ajax之间使用CURL。因此,通过这种方式,我的ajax脚本(用PHP编写)能够通过JSON + CURL通过服务器交换数据,通过CURL POST发送数据,并通过CURL GET重新获取数据,无论涉及哪些域。 / p>
请原谅,也许这不是您需要的答案,但是,IMO,这可以帮助寻找跨站点ajax的人。
答案 3 :(得分:0)
在服务器之间使用GET;就这样。并构建一种散列get的方法,以便在服务器无法完成请求时,用户看不到实际的cookie内容被拉出