有关跨域AJAX问题的几个主题.我一直在看这些,结论似乎是这样的:
除了使用像JSONP或代理sollution这样的东西,你不应该对另一个域做一个基本的jquery $ .post()
我的测试代码看起来像这样(在" http://myTestdomain.tld/path/file.html " 上运行)
var myData = {datum1 : "datum", datum2: "datum"} $.post("http://External-Ip:port", myData,function(return){alert(return);});
当我尝试这个(我开始寻找的原因)时,chrome-console告诉我:
XMLHttpRequest无法加载 http:// External-IP:port/page.php.Access-Control-Allow-Origin不允许使用Origin http://myTestdomain.tld.
现在,就我所知,这是预期的.我不应该这样做.问题是POST实际上已经到了低谷.我有一个简单的脚本运行,保存$_POST
到一个文件,很明显帖子得到了低谷.我返回的任何实际数据都没有传递给我的调用脚本,由于访问控制问题,这似乎再次出现.但实际上这个帖子到达服务器的事实让我感到困惑.
我认为在"myTestdomain"上运行的上述代码不能$.post()
对其他域(外部IP)执行简单操作是否正确?
是否预期请求实际上会到达external-ip的脚本,即使没有收到输出?或者这是一个错误.(我使用的是Chrome 11.0.696.60)
Marlies.. 5
我之前在WebKit bugtracker上发布了一张关于此的票据,因为我认为这是一种奇怪的行为并且可能存在安全风险.
由于与安全相关的门票不可公开查看,我将引用Justin Schuh的回复:
这完全按照规范的要求实现.对于简单的跨源请求http://www.w3.org/TR/cors/#simple-method>,没有飞行前检查; 如果相应的标头未授权请求源,则发出请求并且无法读取响应.在功能上,这与创建表单和使用脚本进行非原始POST(这一直是可能的)没有什么不同.
所以:你被允许进行POST,因为无论如何你可以通过嵌入表单并用javascript触发提交按钮来完成,但是你看不到结果.因为您无法在表单方案中执行此操作.
解决方案是向目标服务器上运行的脚本添加标头,例如
没有测试过,但根据规范,这应该工作.
Firefox 3.6似乎以不同的方式处理它,首先执行OPTIONS以查看它是否可以执行实际的POST.Firefox 4做了同样的事情,或者至少它在我的快速实验中做了.有关这方面的更多信息,请访问https://developer.mozilla.org/en/http_access_control
我之前在WebKit bugtracker上发布了一张关于此的票据,因为我认为这是一种奇怪的行为并且可能存在安全风险.
由于与安全相关的门票不可公开查看,我将引用Justin Schuh的回复:
这完全按照规范的要求实现.对于简单的跨源请求http://www.w3.org/TR/cors/#simple-method>,没有飞行前检查; 如果相应的标头未授权请求源,则发出请求并且无法读取响应.在功能上,这与创建表单和使用脚本进行非原始POST(这一直是可能的)没有什么不同.
所以:你被允许进行POST,因为无论如何你可以通过嵌入表单并用javascript触发提交按钮来完成,但是你看不到结果.因为您无法在表单方案中执行此操作.
解决方案是向目标服务器上运行的脚本添加标头,例如
没有测试过,但根据规范,这应该工作.
Firefox 3.6似乎以不同的方式处理它,首先执行OPTIONS以查看它是否可以执行实际的POST.Firefox 4做了同样的事情,或者至少它在我的快速实验中做了.有关这方面的更多信息,请访问https://developer.mozilla.org/en/http_access_control