又是cors跨域…
cors是啥? 就是跨域请求。对于cors这我就不多讲了,上次有一篇ajax cors cookie的文章专门描述了跨域请求出现的问题。 一朋友在群里问关于nginx cors header的问题。 趁这机会聊下nginx cors的相关配置,及非正常情况下http code的配置。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
允许哪个域名来访问资源 add_header 'Access-Control-Allow-Origin' "$http_origin"; 请求的返回内容里包含cookies add_header 'Access-Control-Allow-Credentials' 'true'; 允许请求的method add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
下面是关于nginx add_header cors的配置实例。
#xiaorui.cc location / { if (http_origin ~* (xiaorui.cc\.address\.sina)) { setcors "true"; } if (request_method = 'OPTIONS') { setcors "{cors}options"; } if (request_method = 'GET') { set cors "{cors}get"; } if (request_method = 'POST') { setcors "{cors}post"; } if (cors = "true") { # Catch all incase there's a request method we're not dealing with properly add_header 'Access-Control-Allow-Origin' "http_origin"; } if (cors = "trueget") { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; } }
可以用这个方式测试.
curl -I -X OPTIONS -H “Origin: http://www.example.com” http://www.xiaorui.cc
http://wiki.nginx.org/NginxHttpHeadersMoreModule#more_set_headers
其中有个问题需要说明下,如果请求的资源不存在,也就是404 not found状态。
那么nginx cors返回给客户的内容里是没有关于cors的信息的,估摸是nginx认为你这都404了,还要啥cors的头部信息。
如果你就是想加入这信息咋办?
第一种方法:
可以使用more_set_headers控制. more_set_headers 'Access-Control-Allow-Origin: *'; 也可以针对404状态码来加入headers. more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
但more_set_headers需要nginx扩展支持的。 详细资料 https://github.com/openresty/headers-more-nginx-module#installation
wget 'http://nginx.org/download/nginx-1.9.7.tar.gz' tar -xzvf nginx-1.9.7.tar.gz cd nginx-1.9.7/ ./configure --prefix=/opt/nginx \ --add-module=/path/to/headers-more-nginx-module make make install
第二种方法:
在你的后端web服务器里做相应的配置,如果没有cors? 那么自己扩展吧。
END.