Nginx跨域配置

2023-11-20

一 跨域概述

 

1.1 同源策略

同源策略是一个安全策略。同源,指的是协议,域名,端口相同。浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的资源。

同源策略主要是基于如下可能的安全隐患:

  1. 用户访问www.mybank.com,登录并进行网银操作,这时cookie等资源都生成并存放在浏览器;
  2. 用户突然访问一个另一个网站;
  3. 该网站在页面中,拿到银行的cookie,比如用户名,登录token等,然后发起对www.mybank.com的操作;
  4. 若此时浏览器不对跨域做限制,并且银行也没有做相应的安全处理的话,那么用户的信息有可能就这么泄露了。

1.2 跨域简介

CORS是一个W3C标准,全称是跨域资源共享(Cross-origin resource sharing)。即从一个域名的网页去请求另一个域名的资源。本质上对于此类请求,只要协议、域名、端口有任何一个的不同,就被当作是跨域,即都被当成不同源。

通常基于安全考虑,Nginx启用了同源策略,即限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

但若同一个公司内部存在多个不同的子域,子域之间需要互访,此时可通过跨域进行实现。跨域可通过JSONP和CORS进行实现。

注意:

  1. 如果是协议和端口造成的跨域问题"前端"是无法解决的;
  2. 在跨域实现上,仅仅是通过"URL的首部"来识别而不会根据域名对应的IP地址是否相同来判断。"URL的首部"可以理解为""协议,域名和端口必须匹配";
  3. 请求跨域并不是请求发不出去,请求可正常发出,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。

提示:

本实验基于Nginx的CORS实现跨域,更多JSONP等参考:
https://juejin.im/post/5e6c58b06fb9a07ce01a4199。

1.3 跨域处理流程

  1. 首先查看http头部有无origin字段;
  2. 如果没有,或者不允许,直接当成普通人请求处理,结束;
  3. 如果有并且是允许的,那么再看是否是preflight(method=OPTIONS);
  4. 如果是preflight,就返回Allow-Headers、Allow-Methods等,内容为空;
  5. 如果不是preflight,就返回Allow-Origin、Allow-Credentials等,并返回正常内容。

  1 location /pub/(.+) {
  2     if ($http_origin ~ <允许的域(正则匹配)>) {
  3         add_header 'Access-Control-Allow-Origin' "$http_origin";
  4         add_header 'Access-Control-Allow-Credentials' "true";
  5         if ($request_method = "OPTIONS") {
  6             add_header 'Access-Control-Max-Age' 86400;
  7             add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE';
  8             add_header 'Access-Control-Allow-Headers' 'reqid, nid, host, x-real-ip, x-forwarded-ip, event-type, event-id, accept, content-type';
  9             add_header 'Content-Length' 0;
 10             add_header 'Content-Type' 'text/plain, charset=utf-8';
 11             return 204;
 12         }
 13     }
 14     # 正常nginx配置
 15     ......
 16 }

二 CORS介绍

2.1 CORS实现

CORS需要浏览器和后端同时支持。在后端配置了CORS实现跨域后,浏览器会自动进行CORS通信,从而实现跨域。

2.2 请求类型

在使用CORS的场景下,对于客户端(前端)的常见请求,可分类如下两类请求:

  • 简单请求

只要同时满足以下两个条件,就属于简单的请求

方法:GET、HEAD、POST。

内容:Content-Type 的值仅限于下列三者之一 :

    • text/plain;
    • multipart/form-data;
    • application/x-www-form-urlencoded 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器。
  • 复杂请求

方法:DELETE、PUT。

不符合以上条件的请求就肯定是复杂请求了。复杂请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求。该请求是option方法的,通过该请求来获知服务端是否允许跨域请求。

回到顶部

三 Nginx跨域配置

3.1 配置语法

语法:add_header name value [always];

默认值:——

可配置段:http, server, location, if in location

配置项释义:

  • Access-Control-Allow-Origin:配置 Access-Control-Allow-Origin 为 * 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求,也可以指定一个确定的URL。
  • Access-Control-Allow-Headers:配置 Access-Control-Allow-Headers,代表允许在请求该地址的时候带上指定的请求头,例如:Content-Type,Authorization,使用逗号(,)拼接起来放在双引号(")中,可根据实际请求类型添加,可防止出现以下错误:

Request header field Content-Type is not allowed by
Access-Control-Allow-Headers in preflight response。这个错误表示当前请求Content-Type的值不被支持。其实是因为发起了"application/json"的类型请求导致的。

  • Access-Control-Allow-Methods:配置 Access-Control-Allow-Methods,代表允许使用指定的方法请求该地址,常见的方法有:GET, POST, OPTIONS, PUT, PATCH, DELETE, HEAD。可防止出现以下错误:

Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

  • Access-Control-Max-Age:配置 Access-Control-Max-Age,代表着在 86400 秒之内不用请求该地址的时候 不需要再进行预检请求,也就是跨域缓存。
  • Access-Control-Allow-Credentials 'true':可选字段,为true表示允许发送Cookie。同时,发送时,必须设置XMLHttpRequest.withCredentials为true才有效,请求若服务器不允许浏览器发送,删除该字段即可。
  • return 204:给OPTIONS 添加 204 的返回,为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS,所以服务器需要允许该方法。
  1. 对于简单请求,如GET,只需要在HTTP Response后添加Access-Control-Allow-Origin。
  2. 对于非简单请求,比如POST、PUT、DELETE等,浏览器会分两次应答。第一次preflight(method: OPTIONS),主要验证来源是否合法,并返回允许的Header等。第二次才是真正的HTTP应答。所以服务器必须处理OPTIONS应答。

注意:如上的 add_header 最后都可以加上了 always,它表示不管返回状态码是多少都会使 add_header 生效,有些时候服务端可能会返回 4XX 的状态码,这时候如果少了 always 会导致 add_header 失效,从而导致浏览器报跨域错误。

2.2 配置示例

方案1 *:通配符,全部允许,存在安全隐患(不推荐)。

一旦启用本方法,表示任何域名皆可直接跨域请求:

  1     server {
  2         ...
  3         location / {
  4             # 允许 所有头部 所有域 所有方法
  5             add_header 'Access-Control-Allow-Origin' '*';
  6             add_header 'Access-Control-Allow-Headers' '*';
  7             add_header 'Access-Control-Allow-Methods' '*';
  8             # OPTIONS 直接返回204
  9             if ($request_method = 'OPTIONS') {
 10                 return 204;
 11             }
 12         }
 13         ...
 14     }

方案2:多域名配置(推荐)

配置多个域名在map中 只有配置过的允许跨域:

  1  map $http_origin $corsHost {
  2         default 0;
  3         "~https://zzzmh.cn" https://zzzmh.cn;
  4         "~https://chrome.zzzmh.cn" https://chrome.zzzmh.cn;
  5         "~https://bz.zzzmh.cn" https://bz.zzzmh.cn;
  6     }
  7     server {
  8         ...
  9         location / {
 10             # 允许 所有头部 所有$corsHost域 所有方法
 11             add_header 'Access-Control-Allow-Origin' $corsHost;
 12             add_header 'Access-Control-Allow-Headers' '*';
 13             add_header 'Access-Control-Allow-Methods' '*';
 14             # OPTIONS 直接返回204
 15             if ($request_method = 'OPTIONS') {
 16                 return 204;
 17             }
 18         }
 19         ...
 20     }

回到顶部

三 跨域配置环境准备

3.1 Nginx02环境预设

主机

域名

备注

Nginx01

corssingle.linuxds.com

corsmulti01.linuxds.com

corsmulti02.linuxds.com

corsmulti03.linuxds.com

corsmulti04.linuxds.com

cors跨域服务器,即需要配置允许跨域被访问。

Nginx02

source01.odocker.com

访问cors的服务器01

Nginx03

source02.odocker.com

访问cors的服务器02

  1 [root@nginx02 ~]# mkdir /usr/share/nginx/source01/
  2 [root@nginx02 ~]# echo '<h1>Source01</h1>' > /usr/share/nginx/source01/index.html

  1 [root@nginx02 ~]# vi /etc/nginx/conf.d/source01.conf
  2 server {
  3     listen  80;							#监听端口
  4     server_name  source01.odocker.com;				#配置虚拟主机名和IP
  5     location / {
  6         root   /usr/share/nginx/source01;			#请求匹配路径
  7         index  index.html;					#指定主页
  8         access_log  /var/log/nginx/source01.access.log  main;
  9         error_log   /var/log/nginx/source01.error.log  warn;
 10     }
 11 }

  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx02 ~]# nginx -s reload				#重载配置文件

3.2 Nginx03环境预设

  1 [root@nginx03 ~]# mkdir /usr/share/nginx/source02/
  2 [root@nginx03 ~]# echo '<h1>Source02</h1>' > /usr/share/nginx/source02/index.html

  1 [root@nginx03 ~]# vi /etc/nginx/conf.d/source02.conf
  2 server {
  3     listen  80;							#监听端口
  4     server_name  source02.odocker.com;				#配置虚拟主机名和IP
  5     location / {
  6         root   /usr/share/nginx/source02;			#请求匹配路径
  7         index  index.html;					#指定主页
  8         access_log  /var/log/nginx/source02.access.log  main;
  9         error_log   /var/log/nginx/source02.error.log  warn;
 10     }
 11 }

  1 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx03 ~]# nginx -s reload				#重载配置文件

3.3 预备环境验证

浏览器分别测试访问:

Nginx跨域配置

回到顶部

四 简单请求跨域

4.1 单域名配置

场景:允许来自source01.odocker.com的应用在cors.linuxds.com上跨域提取数据。

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/corssingle/
  2 [root@nginx01 ~]# echo '<h1>Corssingle</h1>' > /usr/share/nginx/corssingle/index.html

  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/corssingle.conf
  2 server
  3 {
  4     listen 80;
  5     server_name corssingle.linuxds.com;
  6     location /
  7     {
  8         root   /usr/share/nginx/corssingle;
  9         index  index.html index.htm;
 10         access_log  /var/log/nginx/corssingle.access.log  main;
 11         error_log   /var/log/nginx/corssingle.error.log  warn;
 12         #proxy_pass http://source01.odocker.com;
 13         add_header 'Access-Control-Allow-Origin' 'http://source01.odocker.com';
 14         add_header 'Access-Control-Allow-Credentials' 'true';
 15         add_header 'Access-Control-Max-Age' 86400;
 16         add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With';
 17         add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
 18     }
 19 }

  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload				#重载配置文件

4.2 单域名确认验证

[root@client ~]# curl -I -H "Origin: http://source01.odocker.com" http://corssingle.linuxds.com

 

浏览器访问
http://corssingle.linuxds.com/。

 

4.3 多域名配置方法一

场景:允许来自source01.odocker.com和source02.odocker.com的应用,即允许多个域名跨域访问corsmulti01.linuxds.com上的资源。

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/corsmulti01/
  2 [root@nginx01 ~]# echo '<h1>Corsmulti01</h1>' > /usr/share/nginx/corsmulti01/index.html

  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/corsmulti01.conf
  2 map $http_origin $corsHost {
  3     default 0;
  4     "~http://source01.odocker.com" http://source01.odocker.com;
  5     "~http://source02.odocker.com" http://source02.odocker.com;
  6 }
  7 server {
  8     listen 80;
  9     server_name corsmulti01.linuxds.com;
 10     location /
 11     {
 12         if ($request_method = 'OPTIONS') {
 13             return 204;
 14         }
 15         root   /usr/share/nginx/corsmulti01;
 16         index  index.html index.htm;
 17         access_log  /var/log/nginx/corsmulti01.access.log  main;
 18         error_log   /var/log/nginx/corsmulti01.error.log  warn;
 19 
 20         add_header 'Access-Control-Allow-Origin' $corsHost;
 21         add_header 'Access-Control-Max-Age' 86400;
 22         add_header 'Access-Control-Allow-Credentials' 'true';
 23         add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With';
 24         add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
 25 
 26     }
 27 }

  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload				#重载配置文件

4.4 方法一确认验证

[root@client ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti01.linuxds.com

 

浏览器访问
http://corsmulti01.linuxds.com/。

 

4.5 多域名配置方法二

场景:允许来自
localhostsource01.odocker.com或source02.odocker.com的应用,即允许多个域名跨域访问corsmulti02.linuxds.com上的资源。

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/corsmulti02/
  2 [root@nginx01 ~]# echo '<h1>Corsmulti02</h1>' > /usr/share/nginx/corsmulti02/index.html

Nginx跨域配置

  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/corsmulti02.conf
  2 server {
  3     listen 80;
  4     server_name corsmulti02.linuxds.com;
  5     location /
  6     {
  7         root   /usr/share/nginx/corsmulti02;
  8         index  index.html index.htm;
  9         access_log  /var/log/nginx/corsmulti02.access.log  main;
 10         error_log   /var/log/nginx/corsmulti02.error.log  warn;
 11         set $cors '';
 12         if ($http_origin ~* 'https?://(localhost|source01\.odocker\.com|source01\.odocker\.com)') {
 13             set $cors 'true';
 14         }
 15 
 16         if ($cors = 'true') {
 17             add_header 'Access-Control-Allow-Origin' "$http_origin";
 18             add_header 'Access-Control-Allow-Credentials' 'true';
 19             add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
 20             add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
 21         }
 22 
 23         if ($request_method = 'OPTIONS') {
 24             return 204;
 25         }
 26     }
 27 }
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload				#重载配置文件

4.6 方法二确认验证

[root@client ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti02.linuxds.com

 

浏览器访问
http://corsmulti02.linuxds.com/,略。

4.7 多域名配置方法三

场景:允许来自*.odocker.com的应用,即允许多个域名跨域访问corsmulti03.linuxds.com上的资源。

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/corsmulti03/
  2 [root@nginx01 ~]# echo '<h1>Corsmulti03</h1>' > /usr/share/nginx/corsmulti03/index.html

  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/corsmulti03.conf
  2 server {
  3     listen 80;
  4     server_name corsmulti03.linuxds.com;
  5     location /
  6     {
  7         root   /usr/share/nginx/corsmulti03;
  8         index  index.html index.htm;
  9         access_log  /var/log/nginx/corsmulti03.access.log  main;
 10         error_log   /var/log/nginx/corsmulti03.error.log  warn;
 11         if ( $http_origin ~ http://(.*).odocker.com){
 12             set $allow_url $http_origin;
 13         }
 14     	#CORS(Cross Orign Resource-Sharing)跨域控制配置
 15         add_header 'Access-Control-Allow-Credentials' 'true';	#是否允许请求带有验证信息
 16         add_header 'Access-Control-Allow-Origin' "$allow_url";	#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
 17         add_header 'Access-Control-Allow-Headers' 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';				#允许脚本访问的返回头
 18         add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS,PUT,DELETE';	#允许使用的请求方法,以逗号隔开
 19         add_header 'Access-Control-Expose-Headers' 'WWW-Authenticate,Server-Authorization';							        #允许自定义的头部,以逗号隔开,大小写不敏感
 20         add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';						#P3P支持跨域cookie操作
 21     }
 22 }

  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload				#重载配置文件

4.8 方法三确认验证

[root@client ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti03.linuxds.com

 

浏览器访问
http://corsmulti03.linuxds.com/。

五 复杂请求跨域

5.1 复杂请求

默认
Access-Control-Allow-Origin开启跨域请求只支持GET、HEAD、POST、OPTIONS请求,使用DELETE发起跨域请求时,浏览器出于安全考虑会先发起OPTIONS请求,服务器端接收到的请求方式就变成了OPTIONS,所以会导致服务器的405 Method Not Allowed。

5.2 复杂请求配置

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/corscomplex/
  2 [root@nginx01 ~]# echo '<h1>Corscomplex</h1>' > /usr/share/nginx/corscomplex/index.html
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/corscomplex.conf
  2 server
  3 {
  4     listen 80;
  5     server_name corscomplex.linuxds.com;
  6     location /
  7     {
  8         root   /usr/share/nginx/corscomplex;
  9         index  index.html index.htm;
 10         access_log  /var/log/nginx/corscomplex.access.log  main;
 11         error_log   /var/log/nginx/corscomplex.error.log  warn;
 12         #proxy_pass http://source01.odocker.com;
 13 
 14         add_header Cache-Control private;
 15         add_header 'Access-Control-Allow-Origin' 'http://source01.odocker.com';
 16         add_header 'Access-Control-Allow-Credentials' 'true';
 17         add_header 'Access-Control-Max-Age' 86400;
 18         add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
 19         add_header 'Access-Control-Allow-Headers' 'DNT,Content-Type,Cache-Control,User-Agent,Keep-Alive,Authorization,Accept,X-Mx-ReqToken,Origin,X-Requested-With,X-CustomHeader,If-Modified-Since,Cache-Control,If-Modified-Since';
 20         if ($request_method = 'OPTIONS') {
 21             add_header 'Access-Control-Allow-Origin' 'http://source01.odocker.com';
 22             add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE';
 23             return 204;
 24         }
 25     }
 26 }

  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf		#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload				#重载配置文件

5.3 复杂请求确认验证

  1 [root@client ~]# curl -I -X OPTIONS -H "Origin: http://source01.odocker.com" http://corscomplex.linuxds.com
  2 [root@client ~]# curl -I -H "Origin: http://source01.odocker.com" http://corscomplex.linuxds.com

 

浏览器访问
http://corscomplex.linuxds.com/。

 

回到顶部

六 其他更多示例

6.1 区分请求跨域一

  1 server
  2 {
  3     listen 80;
  4     server_name multireq01.linuxds.com;
  5     root root   /usr/share/nginx/multireq01;
  6     access_log  /var/log/nginx/multireq01.access.log  main;
  7     error_log   /var/log/nginx/multireq01.error.log  warn;
  8     location /
  9     {
 10         if ($request_method = 'OPTIONS') {
 11             add_header 'Access-Control-Allow-Origin' '*';
 12             add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 13             add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 14             add_header 'Access-Control-Max-Age' 1728000;
 15             add_header 'Content-Type' 'text/plain charset=UTF-8';
 16             add_header 'Content-Length' 0;
 17             return 204;
 18         }
 19         if ($request_method = 'POST') {
 20             add_header 'Access-Control-Allow-Origin' '*';
 21             add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 22             add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 23         }
 24         if ($request_method = 'GET') {
 25             add_header 'Access-Control-Allow-Origin' '*';
 26             add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 27             add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 28         }
 29     }
 30 }

6.2 区分请求跨域二

  1 server
  2 {
  3     listen 80;
  4     server_name multireq02.linuxds.com;
  5     root root   /usr/share/nginx/multireq02;
  6     access_log  /var/log/nginx/multireq02.access.log  main;
  7     error_log   /var/log/nginx/multireq02.error.log  warn;
  8     location /
  9     {
 10         if ($request_method = 'OPTIONS') {
 11             add_header 'Access-Control-Allow-Origin' 'https://docs.domain.com';
 12             add_header 'Access-Control-Allow-Credentials' 'true';
 13             add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS';
 14             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,token';
 15             return 204;
 16         }
 17         if ($request_method = 'POST') {
 18             add_header 'Access-Control-Allow-Origin' 'https://docs.domain.com';
 19             add_header 'Access-Control-Allow-Credentials' 'true';
 20             add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS';
 21             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,token';
 22         }
 23         if ($request_method = 'GET') {
 24             add_header 'Access-Control-Allow-Origin' 'https://docs.domain.com';
 25             add_header 'Access-Control-Allow-Credentials' 'true';
 26             add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS';
 27             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,token';
 28         }
 29     }
 30 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx跨域配置 的相关文章

随机推荐

  • Android 一些常见BUG汇总(持续更新)

    写在前面的话 每个开发者在工作中会遇到或多或少的小bug 这里博主把它们记录下来 以便以后查阅 开始 1 file storage emulated 0 DCIM xxx jpg exposed beyond app through Cli
  • [SDOI2012]拯救小云公主【bfs+二分答案】

    题目链接 正难则反 要直接求从起点到终点的最大距离 不妨反过来求最小的可以阻止骑士从起点到终点的对于全体圆的最小半径 那么 就是阻止从左上角到右下角的所有相交圆 于是 就是要变成没有从左上角到右下角的相交圆才可以 那么不妨跑一个bfs来判断
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型)

    参加了下2023届秋招 不得不感叹leetcode lintcode的题目实在太多了 也很难 特别对于我这种非科班生而言 感觉有必要分类整理一下 以便以后在工作中更好的应用 花了点时间刷了下二分查找的相关题目 刷的越多 反而越不会了 先把目
  • 还没做完的小程序

    include
  • 基于swiper使用vue-awesome-swiper 实现鼠标移入暂停自动播放、左右按钮控制前进后退、常见避坑、API中文文档地址

    vue 中使用swiper vue awesome swiper 鼠标移入暂停自动播放 左右按钮控制前进后退 常见避坑 swiper对应vue awesome swiper版本会带来很多坑点 推荐下面对照版本 帮大家避坑了 亲测可用 一 n
  • oracle 中的开窗函数over()

    开窗函数与聚合函数一样 都是对行的集合组进行聚合计算 它用于为行定义一个窗口 这里的窗口是指运算将要操作的行的集合 它对一组值进行操作 不需要使用GROUP BY子句对数据进行分组 能够在同一行中同时返回基础行的列和聚合列 反正我理解这个函
  • 原生-秒数转换为小时、分钟

    function formatSeconds value var secondTime parseInt value 秒 var minuteTime 0 分 var hourTime 0 小时 if secondTime gt 60 如果
  • Python实现迷宫游戏

    项目 迷宫游戏 摘要 1 引言 1 1研究的背景及意义 1 2研究的内容 2 系统结构 2 1系统的结构 2 2基本思路 3 实现代码 3 1Maze类 3 2Player类 3 3Controller类 3 4主函数 4 实验 5 总结和
  • JS修改对象属性的值

    当对象以数字为属性名时 其实就是一个数组 用 var foo 1 a 2 b foo 1 c console log foo 1 c 2 b 当对象以字符为属性名时 直接用 获取属性值 var bar a 1 b 2 c 3 bar a h
  • Java反射获取泛型

    反射泛型方法说明 1 isPrimitive 判断指定的Class对象是否表示一个基本类型 2 isAssignableFrom 表示class是否是参数class的父类 3 ParameterizedType 表示参数化类型如List 4
  • Echarts配置系列-图文并茂教你配置渐变色面积图,折柱双图,环形图,仪表盘图等

    文章目录 说明 渐变色面积图 如何修改图标legend样式 如何去掉折线图小圆点 如何设置粗细 折线图线条设置更细或者更粗 如何修改X轴Y轴字体大小 横向渐变色柱状图 自动转动炫酷百分比环形图 渐变色仪表盘 简约风格圆环百分比仪表盘图 双柱
  • 模板类成员函数特化写法

    昨天有对模板类的函数成员特化需求 目的是为了对不同模板参数实现不同的操作 结果在写过程中碰到already defined的问题 貌似是模板新手最容易碰到的问题了 类外的成员函数和同在类外的特化版本成员函数冲突了 因为对模板用法不是很熟悉
  • java poi 将公文套红 并 电子签章

    套红的方法 签章 import com deepoove poi XWPFTemplate import com deepoove poi xwpf NiceXWPFDocument import lombok extern slf4j S
  • RSA公钥每次签名得到的结果都一样?

    这里记录下 RSA对于同一数据块签名一致的原因是使用的填充算法 涉及PKCS 1 5 PSS 为什么RSA公钥每次加密得到的结果都不一样 RSA PSS数字签名算法
  • nginx的sticky模块

    Sticky工作原理 Sticky是nginx的一个模块 它是基于cookie的一种nginx的负载均衡解决方案 通过分发和识别cookie 来使同一个客户端的请求落在同一台服务器上 默认标识名为route 1 客户端首次发起访问请求 ng
  • neo4j windows图像界面 如何查询最短路径

    MATCH p1 concept name factor p2 concept name cf4 p allshortestpaths p1 10 p2 RETURN p 注意上述p1是变量这个是通用的 只需要更改concept这个即可 你
  • 使用Notepad++工具查看文件的十六进制

    最近在用notepad 打开 dat文件 想看看里面的一些数据但是打开之后发现是乱码 下面给出解决方法 1 首先打开 dat文件 发现是一些乱码 2 点击 插件 gt 搜索hex gt 找到HEX Editor勾选 gt 安装 3 重新打开
  • stm32对flash的读写保护与解除

    一 STM32对内部Flash的保护措施 所有STM32的芯片都提供对Flash的保护 防止对Flash的非法访问 写保护和读保护 1 读保护即大家通常说的 加密 是作用于整个Flash存储区域 一旦设置了Flash的读保护 内置的Flas
  • Nginx跨域配置

    一 跨域概述 1 1 同源策略 同源策略是一个安全策略 同源 指的是协议 域名 端口相同 浏览器处于安全方面的考虑 只允许本域名下的接口交互 不同源的客户端脚本 在没有明确授权的情况下 不能读写对方的资源 同源策略主要是基于如下可能的安全隐