nginx配置跨域请求可携带cookie

东明兄 2021-09-24
0条评论 93 次浏览
东明兄 2021-09-240条评论 93 次浏览

当响应头Access-Control-Allow-Credentialstrue时,跨域请求可携带cookie,但出于安全策略,Access-Control-Allow-CredentialstrueAccess-Control-Allow-Origin不能设置为 *
Access-Control-Allow-Origin的值设置为指定的域名有时候很不方便我们开发,可将值设置为$http_origin,即可解决问题。

具体配置如下:

 server {
             listen           80;
             server_name     test.xxx.com;
             charset utf-8;
             add_header "Access-Control-Allow-Origin" $http_origin always;
             add_header 'Access-Control-Allow-Credentials' true always;
             add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
             add_header 'Access-Control-Allow-Headers' 'Cookie,DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
             add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
             add_header 'Access-Control-Max-Age' 0;
             #add_header 'Cache-Control' no-cache;
             #add_header 'Content-Type' 'text/plain; charset=utf-8';
             #add_header 'Content-Length' 0;
            if ($request_method = 'OPTIONS') {
                return 204;
                }
             location ^~ /static/ {
                 charset                 utf-8,gbk;
                 proxy_pass         http://ebooking.xxx.com_80;
                 proxy_set_header   Host             $host;
                 proxy_set_header   X-Real-IP        $remote_addr;
                 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
             }

            location / {
                 #do something
             }

             ....
               } 

注解:
1.其中 always 是表示 任何情况 都返回,否则只会在200状态码返回。
2.这里把add_header写在了server层,是因为该项目的nginx配置 location比较多,因为每一层都可以从上层继承 add_header,所以直接写在server层,所有的location都可以继承,注意:如果当前层添加了add_header,则不能继承。
层级关系:
http 模块
server 模块
location 模块
location中的 if 模块


这样配置后,所有的域都可请求,如需限制为指定的 域才可请求,可以这样改:

 location / {  
set $cors_origin "";
        if ($http_origin ~* "^http://test.xxx.com$") {
                set $cors_origin $http_origin;
        }
        if ($http_origin ~* "^https://test2.xxx.com$") {
                set $cors_origin $http_origin;
        }
        add_header Access-Control-Allow-Origin $cors_origin;

发表评论

您的电子邮箱地址不会被公开。