Nginx解決前端跨域問題,正確的Nginx跨域配置-後端Nginx CORS跨域配置、CORS設置

最近連續兩個朋友問我跨域相關問題,我猜測可能很多朋友也遇到相似問題,我打算寫個博客聊一下我實際使用的配置,html

先說明一下,我並不太瞭解這配置,沒精力去了解太多,但我以爲其中有一些關鍵的小注意點,可能有些初學者不太注意到,致使配置有問題,本文章可能只對新手有點幫助,若是你有好配置,歡迎評論回覆,讓你們學習!前端

Nginx的CORS配置,網上太多這配置了,但你們更多的複製粘貼、轉發,幾乎都是相似下面這三兩行:web

  1.      add_header Access-Control-Allow-Origin *;後端

  2. add_header Access-Control-Allow-Headers X-Requested-With;api

  3. add_header Access-Control-Allow-Methods GET,POST,OPTIONS;跨域

這樣有用麼?有用,我之前這樣使用也正常過,但後來仍是遇到問題了,發現有些項目請求就不成功,也遇到有些瀏覽器成功,有些瀏覽器不成功;瀏覽器

我也在網上查找各類資料和調整寫法,最後我調整好的寫法,基本的使用沒問題,我在項目中也一直使用着!app

下面發一段我實際項目中的部分配置:ide

  1. location /aoda-web {學習

  2. add_header 'Access-Control-Allow-Origin' $http_origin;

  3. add_header 'Access-Control-Allow-Credentials' 'true';

  4. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

  5. add_header 'Access-Control-Allow-Headers' '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';

  6. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

  7. if ($request_method = 'OPTIONS') {

  8. add_header 'Access-Control-Max-Age' 1728000;

  9. add_header 'Content-Type' 'text/plain; charset=utf-8';

  10. add_header 'Content-Length' 0;

  11. return 204;

  12. }

  13. root   html;

  14. index  index.html index.htm;

  15. proxy_pass http://127.0.0.1:8080;

  16. proxy_set_header Host $host;

  17. proxy_set_header X-Real-IP $remote_addr;

  18. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  19. proxy_set_header X-Forwarded-Proto $scheme;

  20. proxy_connect_timeout 5;

  21. }

跨域相關的配置,主要是下面這部分:


  1.      add_header 'Access-Control-Allow-Origin' $http_origin;

  2. add_header 'Access-Control-Allow-Credentials' 'true';

  3. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

  4. add_header 'Access-Control-Allow-Headers' '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';

  5. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

  6. if ($request_method = 'OPTIONS') {

  7. add_header 'Access-Control-Max-Age' 1728000;

  8. add_header 'Content-Type' 'text/plain; charset=utf-8';

  9. add_header 'Content-Length' 0;

  10. return 204;

  11. }

下面簡單講解一下,以便你們配置成功!

一、Access-Control-Allow-Origin,這裏使用變量 $http_origin取得當前來源域,你們說用「*」表明容許全部,我實際使用並不成功,緣由未知;

二、Access-Control-Allow-Credentials,爲 true 的時候指請求時可帶上Cookie,本身按狀況配置吧;

三、Access-Control-Allow-Methods,OPTIONS必定要有的,另一般也就GET和POST,若是你有其它的也可加進去;

四、Access-Control-Allow-Headers,這個要注意,裏面必定要包含自定義的http頭字段(就是說前端請求接口時,若是在http頭裏加了自定義的字段,這裏配置必定要寫上相應的字段),從上面可看到我寫的比較長,我在網上搜索一些經常使用的寫進去了,裏面有「web-token」和「app-token」,這個是我項目裏前端請求時設置的,因此我在這裏要寫上;

五、Access-Control-Expose-Headers,可不設置,看網上大體意思是默認只能獲返回頭的6個基本字段,要獲取其它額外的,先在這設置才能獲取它;

六、語句「 if ($request_method = 'OPTIONS') { 」,由於瀏覽器判斷是否容許跨域時會先日後端發一個 options 請求,而後根據返回的結果判斷是否容許跨域請求,因此這裏單獨判斷這個請求,而後直接返回;

好了,按我上面配置基本均可使用(有些朋友肯定只百度複製了兩行,而後說配置好了,跟前端朋友互扯),

下面發一個實際配置供參考,我作了少許更改,以下:

  1. server {

  2. listen       80;

  3. server_name  xxx.com;


  4. location /xxx-web/papi {

  5. add_header 'Access-Control-Allow-Origin' $http_origin;

  6. add_header 'Access-Control-Allow-Credentials' 'true';

  7. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

  8. add_header 'Access-Control-Allow-Headers' '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';

  9. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

  10. if ($request_method = 'OPTIONS') {

  11. add_header 'Access-Control-Max-Age' 1728000;

  12. add_header 'Content-Type' 'text/plain; charset=utf-8';

  13. add_header 'Content-Length' 0;

  14. return 204;

  15. }

  16. root   html;

  17. index  index.html index.htm;

  18. proxy_pass http://127.0.0.1:7071;

  19. proxy_set_header Host $host;

  20. proxy_set_header X-Real-IP $remote_addr;

  21. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  22. proxy_set_header X-Forwarded-Proto $scheme;

  23. proxy_connect_timeout 5;

  24. }


  25. location /xxx-web {

  26. add_header 'Access-Control-Allow-Origin' $http_origin;

  27. add_header 'Access-Control-Allow-Credentials' 'true';

  28. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

  29. add_header 'Access-Control-Allow-Headers' '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';

  30. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

  31. if ($request_method = 'OPTIONS') {

  32. add_header 'Access-Control-Max-Age' 1728000;

  33. add_header 'Content-Type' 'text/plain; charset=utf-8';

  34. add_header 'Content-Length' 0;

  35. return 204;

  36. }

  37. root   html;

  38. index  index.html index.htm;

  39. proxy_pass http://127.0.0.1:8080;

  40. proxy_set_header Host $host;

  41. proxy_set_header X-Real-IP $remote_addr;

  42. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  43. proxy_set_header X-Forwarded-Proto $scheme;

  44. proxy_connect_timeout 5;

  45. }


  46. location / {

  47. root   /var/www/xxx/wechat/webroot;

  48. index  index.html index.htm;

  49. }


  50. error_page   500 502 503 504  /50x.html;

  51. location = /50x.html {

  52. root   html;

  53. }

  54. }

本文出自https://blog.csdn.net/envon123/article/details/83270277

相關文章
相關標籤/搜索