2

发起 HTTP GET 或 POST 请求时:

  • 普通浏览器不允许Javacript调用跨域
  • 所以这意味着来自给定域的每个 HTTP 请求,请求标头中的“主机”代表原始主机,比如 foo.com,并且它不能被客户端请求修改?
  • 此外,当请求来自子域时,例如 bar.foo.com,则请求标头中的“主机”将为“bar.foo.com”
  • 这在进行跨域 HTTP 请求时是正确的,即“主机”将是 foo.com 或者来自子域 bar.foo.com,并且接收端(另一个域)将“主机”视为这些主机分别?
4

4 回答 4

1

如果问题是“这是真的”,那么答案是否定的。

  • 浏览器确实允许 JavaScript 创建跨域的 GET 和 POST 请求。他们不允许 javascript 从跨域请求中读取响应。

  • HTTP 标头中的“主机”表示请求被发送到的主机,而不是导致主机的网站。HOST 是必要的,因为服务器通常是共享的,并且一台服务器可能托管许多单独的网站,因此他们需要知道正在请求哪一个。

  • 创建网站的网站通常(尽管不总是)在“REFERER”HTTP 标头中标识。

于 2013-04-19T10:34:09.073 回答
1

一切都通过 HTTP 浏览器沙箱(不仅仅是 AJAX 调用!IFRAME 具有基于相同条件的限制,针对不同的事物 - 即,您无法控制另一个域/主机/端口/proto 上的 IFRAME 的内容,只需加载页面并查看加载内容的 URI。JS 中的内容是禁止的)是在客户端而不是服务器端完成的:您的浏览器将主动拒绝查询任何没有的内容:

  • 相同的主机名(子域算作不同的主机名)
  • 同一个端口
  • 相同的访问方式(HTTP 或 HTTPS)

对于 AJAX,这会导致一个大红色的“由于安全性而无法获取”-esque 错误。对于某些浏览器,请求确实会发生:有一种方法可以绕过此限制,使用访问控制标头。这些有效地告诉您的浏览器“我对x很友好”,其中 x 是域的通配符列表(其中*表示所有内容)。

为了解决这个问题,浏览器将执行请求,如果 CORS 未开启,则会主动触发异常 ( XMLHttpRequest: x is not allowed by y)。然而,请求已经发生

显而易见的解决方案是添加一个 Access-Control-Allow-Origin 标头,以表示对该站点的跨域查询是可以的。但是,请记住两点:

  • 大多数浏览器都有它,但有些没有(IE8 <.<)
  • 如果 URL 是在脚本中硬编码的,CORS 本身就有一些小错误(请阅读它!)

因此,您需要 IE 的 JSONP 后备。但是,请记住,所有这些都是在客户端完成的,并且不能保证没有任何浏览器会主动无视 CORS 或 webkit 安全模型。整个模型还依赖于客户端Host分辨率。

于 2013-04-19T09:57:16.117 回答
0

支持 CORS 的服务器将检查Origin请求中的标头。该值将如您所描述的那样,即请求源自的服务器。在它的回复中,服务器将发送一个名为Access-Control-Allow-Origin. 如果匹配Origin,浏览器将接受响应。它显然还需要浏览器支持 CORS。

维基百科对它的工作原理有相当好的解释

于 2013-04-19T09:55:28.510 回答
-1
  • HostHTTP 请求标头始终是请求要去的域。

  • 如果您使用该XMLHTTPRequest方法发起 HTTP GET 或 POST 请求,那么如果发送请求的 JavaScript 代码与您发送请求的 URL 不在同一个域中,它将不允许您发送请求 -除非浏览器支持跨域资源共享。

  • 如果浏览器确实支持跨域资源共享 (CORS),那么它会将您的请求发送到其他域,但带有一个额外的Origin标头,指示为发出请求的 JavaScript 提供服务的站点。如果服务器允许请求,它会响应一个Access-Control-Allow-Origin标头,列出它将接受来自请求的域。

于 2013-04-19T09:58:20.833 回答