根据我阅读的关于CORS的内容,我理解它应该按照以下方式工作:
- 客户端上的脚本尝试从具有不同来源的服务器获取资源。
- 浏览器拦截此请求并首先向相同的URL发送预检 OPTIONS 请求。
- 如果对此预检请求的响应包含适当的标头(例如,
Access-Control-Allow-Origin: *
),则浏览器会理解可以发送主请求并进行发送。 - 响应返回到客户端脚本。
我设置了一个如下测试:
- 使用Go编写的服务器接受GET和OPTIONS请求(使用CURL进行检查),并在响应中设置
Access-Control-*
标头。 所在端口由另一台服务器提供的简单HTML页面,其中包含以下脚本(
$
代表jQuery):$.ajax({ type: "GET", crossDomain: true, url: "http://local.site.com/endpoint, success: function (data) { alert(data); }, error: function (request, error) { alert(error); } });
但是,当我调用该方法时,在Chrome 49和Firefox 33中的网络选项卡中只看到一个GET请求,没有预检OPTIONS请求。
以下是来自Chrome的GET请求的详细信息:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Connection:keep-alive
Host:local.adform.com
Origin:http://localhost:7500
Referer:http://localhost:7500/test-page.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
和相应的响应:
Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Content-Length:2
Content-Type:text/plain; charset=utf-8
Date:Wed, 03 Aug 2016 10:53:19 GMT
你们有什么想法,为什么我的浏览器不会发送预检请求?