起因
在实际的工作中,我们经常会遇到不通域名之间的js或者接口互相调用的情况,这就需要在被调用端设置CORSheader。
什么是CORS?
出于对安全问题的考虑,1995年由Netscape提出同源策略,浏览器在发送Ajax请求时,只接收同域服务器响应的数据资源。
那么什么才算同域呢?很简单,协议、域名、端口 全部相同才算同一域下,三个条件有一个不一致,都算为跨域。
为了解决跨域通信问题,W3C提出了CORS标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
CORS原理很简单,只需要向响应头header中注入Access-Control-Allow-Origin,这样浏览器检测到header中的Access-Control-Allow-Origin,就可以跨域操作了。
服务器端添加CORS header
以nginx为例,只需要添加几行配置就可以了
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
但是需要注意的是,nginx作为代理,后端服务若是也会相应CORS头部,那么用户会看到2个相同的CORS头部,这会导致浏览器报错,并且跨域失败。因此nginx,还是应用服务,只能有一个加cors header。
使用curl调试
使用Origin字段指定来源域名就可以
curl -H "Origin: http://www.ipcpu.com/" -vvv "http://www.googleapis.com/plugin/dictionary?category=1" -x 127.0.0.1:5000
关于Origin和Referer
上面我们使用了Origin,好多小伙伴就比较好奇,Origin和Referer有什么区别呢?
Origin 指示了请求来自于哪个站点,只有服务器名,不包含路径信息,浏览器自动添加到http请求 Header 中,无需手动设置。
同源请求:POST、OPTIONS、PUT、PATCH 和 DELETE请求都会添加Origin请求头,GET或HEAD请求不会添加Origin请求头。
跨域请求:所有跨域请求(CORS)都会添加Origin请求头。
Referer 指示了请求来自于哪个具体页面,包含服务器名和路径的详细URL,浏览器自动添加到http请求 Header 中,无需手动设置。
除了以下两种情况,浏览器均会自动添加Referer头部信息:
来源页面采用 file 或 data URI 协议;
来源页面采用 HTTPS 协议,而请求页面采用 HTTP 协议;
由此我们可以看出,Referer显示来源页面,具体到URL;Origin显示来源域名,用来做CORS判断用的。
转载请注明:IPCPU-网络之路 » 如何使用cURL调试CORS请求