nginx跨域部分问题

nginx 跨域支持多域名

 

 

map $http_origin $corsHost {
    default 0;
    "~http://www.123admin.com" http://www.123admin.com;
    "~http://m.123admin.com" http://m.123admin.com;
    "~http://wap.123admin.com" http://wap.123admin.com;
}
server
{
    listen 80;
    server_name search.123admin.com;
    root /nginx;
    location /
    {
        add_header Access-Control-Allow-Origin $corsHost;
    }
}

 

 

Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials: true

Access-Control-Allow-Headers: content-type,xfilecategory,xfilename,xfilesize

 

 

 

 

 

 

curl -I -H 'Origin: https://www.xxxxxx.com' https://account.xxxxx.com/test -k

 

 

 

通过对nginx日志的分析,发现了一个OPTIONS类型的请求。经过查证在请求时,OPTIONS请求是客户端的浏览器对服务端发送的一个请求,属于浏览器级行为

OPTIONS请求方法的主要用途有两个:

1、获取服务器支持的HTTP请求方法;

2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

再来看下这个“某些情况下”都是什么情况?

1、跨域请求,非跨域请求不会出现options请求
2、自定义请求头
3、请求头中的content-type是application/x-www-form-urlencoded,multipart/form-data,text/plain之外的格式

当满足条件12或者13的时候,简单的ajax请求就会出现options请求,有没有感觉到一点同源策略的意思,个人理解这个就是浏览器底层对于同源策略的一个具体实现。首先得到服务器端的确认,才能继续下一步的操作,这也是为什么options请求也被叫做“预检”请求的原因吧。

新版ajax 请求时要单独处理一下 option请求

location / {

 
proxy_set_header Host $host;
 
add_header 'Access-Control-Allow-Credentials' 'true';
 
add_header Access-Control-Allow-Origin "$http_origin";
 
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
 
if ($request_method = 'OPTIONS') {
 
return 204;
 
}
 
add_header Cache-Control no-cache;
 
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 
proxy_pass 代理地址
 
 
 
}
posted @ 2021-06-18 18:54  萱乐庆foreverlove  阅读(47)  评论(0编辑  收藏  举报