此主题之前已经有过不同的讨论,但我还没有找到适合我的解决方案。我正在使用jquery 1.7.1。
我有一个可以返回JSON和XML的REST样式的Web服务,但对于这个项目,我需要使用XML端点。为了解决跨域限制,我使用Perl的HTTP :: Proxy创建了一个透明代理。这个代理工作轻而易举,因为我可以从任何地方使用HTTP GET客户端与它交谈。
由于它是透明代理,因此它依赖于在客户端请求中设置的主机头。我的代码如下所示:
$.ajax({
type: "GET",
crossDomain: true, // not needed I think
error: function() { alert('Failed ..'); },
url: "http://www.skiforeningen.no:8080/<remote REST URL>",
dataType: "xml",
headers: {'Host': 'remote REST host'},
success: parseXml,
});
Chrome非常明确,并说
拒绝设置不安全的标题“Host”
和
XMLHttpRequest无法加载http://www.skiforeningen.no:8080/sted/Norge/Oslo/Oslo/Skansebakken/varsel.xml。 Access-Control-Allow-Origin
不允许原点http://www.skiforeningen.no
但代理和带有jquery的HTML页面都位于主机www.skiforeningen.no。
自触发错误事件处理程序以来,FF也拒绝设置Host头(显然)。
谢谢,
答案 0 :(得分:5)
你不能在不同的主机上执行XHR请求,就像错误消息告诉你的那样。不同的端口意味着不同的主机。
请参阅:Can I use XMLHttpRequest on a different port from a script file loaded from that port?
答案 1 :(得分:0)
某些headers are forbidden and cannot be set programmatically:
- 接受字符集
- 接受编码
- 访问控制请求标头
- 访问控制请求方法
- 连接
- 内容长度
- 饼干
- Cookie2
- 日期
- DNT
- 期望
- 特征政策
- 主机
- 保持生命
- 来源
- 代理-
- 秒-
- 推荐人
- TE
- 拖车
- 传输编码
- 升级
- 通过
这就是为什么您无法设置host
的原因。
greut's answer关于无法向其他主机发出XHR请求是不正确的-没有任何事情可以阻止发出请求。
该错误仅表示由于相同来源策略(SOP),您自己页面的原始内容无法访问该响应。
Fiddle here表示当您通过代理观察HTTP请求时实际上是发出的:
因此,即使您不关心响应,您的方法也可以使用,尽管您可能希望更优雅地处理此预期错误。如果您确实关心响应,则必须在远程服务器上配置CORS,以便跨域读取响应。将crossDomain
设置为true
可以防止JQuery添加任何额外的标头,而这些标头可能会导致发出OPTIONS请求(即X-Requested-With
)。