您的位置:首页 > 运维架构 > Nginx

Nginx通过CORS配置实现跨域访问

2017-03-13 15:52 666 查看
CORS: Cross-origin resource sharing (跨域资源共享),是指a页面想获得b页面的资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的的访问都是进行跨域的,而浏览器为了安全考虑,对跨域访问一般都是进行了限制的。需要注意的是,CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

浏览器将所有的CORS请求分为简单请求和非简单请求,对于简单请求来说,以GET为例:


if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}


上面的配置中:
Access-Control-Allow-Origin:必须配置的字段,'*'表示接受任意域名的请求,也可以指定接受某一个域名的请求
Access-Control-Request-Headers:如果浏览器请求包括Access-Control-Request-Headers字段,则在Nginx配置中也是必须的,是一个由逗号分隔的字符串
Access-Control-Expose-Headers:可选配置字段。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。


if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'http://m-dev.pengyunliuxue.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}


Access-Control-Request-Method:该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Max-Age:用来指定本次预检请求的有效期,单位为秒
其他参数参考简单请求即可


参考文章:

跨域资源共享详解

CORS on Nginx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx 跨域名 cors