014.Nginx跨域配置

来源:https://www.cnblogs.com/itzgr/archive/2020/07/20/13343387.html
-Advertisement-
Play Games

一 跨域概述 1.1 同源策略 同源策略是一個安全策略。同源,指的是協議,功能變數名稱,埠相同。瀏覽器處於安全方面的考慮,只允許本功能變數名稱下的介面交互,不同源的客戶端腳本,在沒有明確授權的情況下,不能讀寫對方的資源。 同源策略主要是基於如下可能的安全隱患: 用戶訪問www.mybank.com,登錄併進行網銀 ...


一 跨域概述

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 跨域處理流程

clipboard

  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 [[email protected] ~]# mkdir /usr/share/nginx/source01/
  2 [[email protected] ~]# echo '<h1>Source01</h1>' > /usr/share/nginx/source01/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

3.2 Nginx03環境預設

  1 [[email protected] ~]# mkdir /usr/share/nginx/source02/
  2 [[email protected] ~]# echo '<h1>Source02</h1>' > /usr/share/nginx/source02/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

3.3 預備環境驗證

瀏覽器分別測試訪問:

clipboard

四 簡單請求跨域

4.1 單功能變數名稱配置

場景:允許來自source01.odocker.com的應用在cors.linuxds.com上跨域提取數據。

  1 [[email protected] ~]# mkdir /usr/share/nginx/corssingle/
  2 [[email protected] ~]# echo '<h1>Corssingle</h1>' > /usr/share/nginx/corssingle/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

4.2 單功能變數名稱確認驗證

[[email protected] ~]# curl -I -H "Origin: http://source01.odocker.com" http://corssingle.linuxds.com

clipboard

瀏覽器訪問http://corssingle.linuxds.com/。

clipboard

4.3 多功能變數名稱配置方法一

場景:允許來自source01.odocker.com和source02.odocker.com的應用,即允許多個功能變數名稱跨域訪問corsmulti01.linuxds.com上的資源。

  1 [[email protected] ~]# mkdir /usr/share/nginx/corsmulti01/
  2 [[email protected] ~]# echo '<h1>Corsmulti01</h1>' > /usr/share/nginx/corsmulti01/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

4.4 方法一確認驗證

[[email protected] ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti01.linuxds.com

clipboard

瀏覽器訪問http://corsmulti01.linuxds.com/。

clipboard

4.5 多功能變數名稱配置方法二

場景:允許來自localhostsource01.odocker.com或source02.odocker.com的應用,即允許多個功能變數名稱跨域訪問corsmulti02.linuxds.com上的資源。

  1 [[email protected] ~]# mkdir /usr/share/nginx/corsmulti02/
  2 [[email protected] ~]# echo '<h1>Corsmulti02</h1>' > /usr/share/nginx/corsmulti02/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

4.6 方法二確認驗證

[[email protected] ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti02.linuxds.com

clipboard

瀏覽器訪問http://corsmulti02.linuxds.com/,略。

4.7 多功能變數名稱配置方法三

場景:允許來自*.odocker.com的應用,即允許多個功能變數名稱跨域訪問corsmulti03.linuxds.com上的資源。

  1 [[email protected] ~]# mkdir /usr/share/nginx/corsmulti03/
  2 [[email protected] ~]# echo '<h1>Corsmulti03</h1>' > /usr/share/nginx/corsmulti03/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

4.8 方法三確認驗證

[[email protected] ~]# curl -I -H "Origin: http://source01.odocker.com" http://corsmulti03.linuxds.com

clipboard

瀏覽器訪問http://corsmulti03.linuxds.com/。

clipboard

五 複雜請求跨域

5.1 複雜請求

預設Access-Control-Allow-Origin開啟跨域請求只支持GET、HEAD、POST、OPTIONS請求,使用DELETE發起跨域請求時,瀏覽器出於安全考慮會先發起OPTIONS請求,伺服器端接收到的請求方式就變成了OPTIONS,所以會導致伺服器的405 Method Not Allowed。

5.2 複雜請求配置

  1 [[email protected] ~]# mkdir /usr/share/nginx/corscomplex/
  2 [[email protected] ~]# echo '<h1>Corscomplex</h1>' > /usr/share/nginx/corscomplex/index.html
  1 [[email protected] ~]# 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 [[email protected] ~]# nginx -t -c /etc/nginx/nginx.conf		#檢查配置文件
  2 [[email protected] ~]# nginx -s reload				#重載配置文件

5.3 複雜請求確認驗證

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

clipboard

瀏覽器訪問http://corscomplex.linuxds.com/。

clipboard

六 其他更多示例

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 }
參考鏈接:https://www.hi-linux.com/posts/60405.html。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是一個使用WinForm開發的程式,用於在電腦上播放特定的樂音,包括中央C和國際標準音。 界面如下: .NET其實非常強大。使用.NET WinForm開發還是相當高效的,值得學習。 下載:https://hovertree.com/h/bjag/mcmub5gm.htm ...
  • 可以直接用CE進行雷總數修改,下麵是通過C#直接修改雷總數記憶體地址 /// PROCESS_ALL_ACCESS -> (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF) public const int PROCESS_ALL_ACCESS = (ST ...
  • 在本文中,我將展示如何使用DfaGraphWriter服務在ASP.NET Core 3.0應用程式中可視化你的終結點路由。上面文章我向您演示瞭如何生成一個有向圖(如我上篇文章中所示),可以使用GraphVizOnline將其可視化。最後,我描述了應用程式生命周期中可以檢索圖形數據的點。 作者:依樂 ...
  • nginx的調度演算法中hash $remote_addr 和ip_hash是把IP地址的前24位做hash,所以如果你的IP前三段相同時,nginx它會認為是和nginxserver是同一區域網,所以它會把請求調度到同一區域網之前來請求過的後端server上進行響應;當然除了我們可以對源地址做ha... ...
  • cut 命令在Linux和Unix中的作用是從文件中的每一行中截取出一些部分,並輸出到標準輸出中。我們可以使用 cut 命令從一行字元串中於以位元組,字元,欄位(分隔符)等單位截取一部分內容出來。 在本文中,我們通過一些例子來瞭解 cut 命令的使用,這些使用方法在我們的日常工作中也是非常常用的。 C ...
  • 方法一: 使用原版wine,並配置q4wine,並下載最新的wechat 進行安裝使用; 可能會出現問題,需要自己調試解決; 方法二: 使用deepin-wine 和deepin-wechat,因為這個已經得到了測試,所以錯誤少點,用的人也多一點; 安裝方式: https://gitee.com/w ...
  • Java整個堆大小設置 Xmx 和 Xms設置為老年代存活對象的3-4倍,即FullGC之後的老年代記憶體占用的3-4倍 永久代PermSize和MaxPermSize設置為老年代存活對象的1.2-1.5倍。 永久區並不是老年代的1.2到1.5倍,而是FullGC後永久區的1.2到1.5倍 1.2x ...
  • swap交換記憶體主要是指當物理記憶體不夠用時,系統會啟用硬碟的一部分空間來充當伺服器記憶體,而預設情況下swap記憶體會有一些設置標準,它與物理記憶體的大小也是有關係的,具體標準如下: Ram大小 Swap大小 激活Swap後合計大小 256MB 256MB 512MB 512MB 512MB 1GB 1G ...
一周排行
    -Advertisement-
    Play Games
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...