无法在$ .ajax请求上设置HTTP主机头

时间:2012-01-14 22:32:48

标签: jquery ajax proxy

此主题之前已经有过不同的讨论,但我还没有找到适合我的解决方案。我正在使用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头(显然)。

谢谢,

2 个答案:

答案 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请求时实际上是发出的:

HTTP Request

因此,即使您不关心响应,您的方法也可以使用,尽管您可能希望更优雅地处理此预期错误。如果您确实关心响应,则必须在远程服务器上配置CORS,以便跨域读取响应。将crossDomain设置为true可以防止JQuery添加任何额外的标头,而这些标头可能会导致发出OPTIONS请求(即X-Requested-With)。