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 [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 預備環境驗證

瀏覽器分別測試訪問:

clipboard

四 簡單請求跨域

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

clipboard

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

clipboard

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

clipboard

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

clipboard

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
  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

clipboard

瀏覽器訪問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

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 [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

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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...