国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Nginx 代理解決跨域問題分析

這篇具有很好參考價值的文章主要介紹了Nginx 代理解決跨域問題分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

當你遇到跨域問題,不要立刻就選擇復制去嘗試。請詳細看完這篇文章再處理 。我相信它能幫到你。

分析前準備:

前端網(wǎng)站地址:http://localhost:8080

服務端網(wǎng)址:http://localhost:59200?

首先保證服務端是沒有處理跨域的,其次,先用postman測試服務端接口是正常的。

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

當網(wǎng)站8080去訪問服務端接口時,就產(chǎn)生了跨域問題,那么如何解決?接下來我把跨域遇到的各種情況都列舉出來并通過nginx代理的方式解決(后臺也是一樣的,只要你理解的原理)。

跨域主要涉及4個響應頭:

Access-Control-Allow-Origin?用于設置允許跨域請求源地址?(預檢請求和正式請求在跨域時候都會驗證)

Access-Control-Allow-Headers?跨域允許攜帶的特殊頭信息字段?(只在預檢請求驗證)

Access-Control-Allow-Methods?跨域允許的請求方法或者說HTTP動詞?(只在預檢請求驗證)

Access-Control-Allow-Credentials?是否允許跨域使用cookies,如果要跨域使用cookies,可以添加上此請求響應頭,值設為true(設置或者不設置,都不會影響請求發(fā)送,只會影響在跨域時候是否要攜帶cookies,但是如果設置,預檢請求和正式請求都需要設置)。不過不建議跨域使用(項目中用到過,不過不穩(wěn)定,有些瀏覽器帶不過去),除非必要,因為有很多方案可以代替。

網(wǎng)上很多文章都是告訴你直接Nginx添加這幾個響應頭信息就能解決跨域,當然大部分情況是能解決,但是我相信還是有很多情況,明明配置上了,也同樣會報跨域問題。

什么是預檢請求?:當發(fā)生跨域條件時候,覽器先詢問服務器,當前網(wǎng)頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發(fā)出正式的XMLHttpRequest請求,否則就報錯。如下圖:

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

開始動手模擬:

Nginx代理端口:22222,配置如下:

server?{    listen       22222;    server_name  localhost;    location  / {        proxy_pass  http://localhost:59200;    }}

測試代理是否成功,通過Nginx代理端口2222再次訪問接口,可以看到如下圖通過代理后接口也是能正常訪問。

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

接下來開始用網(wǎng)站8080訪問Nginx代理后的接口地址,報錯情況如下↓↓↓

情況1:?

Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to?preflight?request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

通過錯誤信息可以很清晰的定位到錯誤(注意看標紅部分)priflight說明是個預請求,CORS 機制跨域會首先進行 preflight(一個 OPTIONS 請求), 該請求成功后才會發(fā)送真正的請求。這一設計旨在確保服務器對 CORS 標準知情,以保護不支持 CORS 的舊服務器。

通過錯誤信息,我們可以得到是預檢請求的請求響應頭缺少了 Access-Control-Allow-Origin,錯哪里,我們改哪里就好了。修改Nginx配置信息如下(紅色部分為添加部分),缺什么就補什么,很簡單明了。

server {    listen       22222;    server_name  localhost;    location  / {       add_header Access-Control-Allow-Origin 'http://localhost:8080';       proxy_pass  http://localhost:59200;     }}

哈哈,當滿懷歡喜的以為能解決后,發(fā)現(xiàn)還是報了同樣的問題。

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

不過我們的配置沒什么問題,問題在Nginx,下圖鏈接http://nginx.org/en/docs/http/ngx_http_headers_module.html

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

add_header 指令用于添加返回頭字段,當且僅當狀態(tài)碼為圖中列出的那些時有效。如果想要每次響應信息都攜帶頭字段信息,需要在最后添加always(經(jīng)我測試,只有Access-Control-Allow-Origin這個頭信息需要加always,其他的不加always也會攜帶回來),那我們加上試試。

server {    listen       22222;    server_name  localhost;    location  / {       add_header Access-Control-Allow-Origin 'http://localhost:8080' always;       proxy_pass  http://localhost:59200;     }}

修改了配置后,發(fā)現(xiàn)生效了,當然不是跨域就解決了,是上面這個問題已經(jīng)解決了,因為報錯內容已經(jīng)變了。

情況2:

Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to?preflight request?doesn't pass access control check:?It does not have HTTP ok status.

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

通過報錯信息提示可以得知,是跨域瀏覽器默認行為的預請求(option請求)沒有收到ok狀態(tài)碼,此時再修改配置文件,當請求為option請求時候,給瀏覽器返回一個狀態(tài)碼(一般是204)。

server {    listen       22222;    server_name  localhost;    location  / {       add_header Access-Control-Allow-Origin 'http://localhost:8080' always;       if ($request_method = 'OPTIONS') {            return 204;       }       proxy_pass  http://localhost:59200;     }}

當配置完后,發(fā)現(xiàn)報錯信息變了。

情況3:

Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field?authorization?is not allowed by?Access-Control-Allow-Headers?in preflight response.

意思就是預請求響應頭Access-Control-Allow-Headers中缺少頭信息authorization(各種情況會不一樣,在發(fā)生跨域后,在自定義添加的頭信息是不允許的,需要添加到請求響應頭Access-Control-Allow-Headers中,以便瀏覽器知道此頭信息的攜帶是服務器承認合法的,我這里攜帶的是authorization,其他的可能是token之類的,缺什么加什么),知道了問題所在,然后修改配置文件,添加對應缺少的部分,再試試。

server?{    listen       22222;    server_name  localhost;    location  / {       add_header Access-Control-Allow-Origin 'http://localhost:8080' always;       if ($request_method = 'OPTIONS') {           add_header Access-Control-Allow-Headers 'authorization'; #為什么寫在if里面而不是接著Access-Control-Allow-Origin往下寫?因為這里只有預檢請求才會檢查           return 204;       } ??????proxy_pass?http://localhost:59200;?    }}

此時發(fā)現(xiàn)報錯問題又回到了情況1。

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

經(jīng)測試驗證,只要if ($request_method = 'OPTIONS') 里面寫了 add_header ,當為預檢請求時外部配置的都會失效,為什么?↓↓。

官方文檔是這樣說的:

There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

意思就是當前層級無 add_header 指令時,則繼承上一層級的add_header。相反的若當前層級有了add_header,就應該無法繼承上一層的add_header。

server?{    listen       22222;    server_name  localhost;    location  / {        add_header Access-Control-Allow-Origin 'http://localhost:8080' always;        if ($request_method = 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080';            add_header Access-Control-Allow-Headers 'authorization';            return 204;        }        proxy_pass  http://localhost:59200;     }}

此時改完發(fā)現(xiàn)跨域問題已經(jīng)解決了:

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

不過以上雖然解決了跨域問題,但是考慮后期可能Nginx版本更新,不知道這個規(guī)則會不會被修改,考慮到這樣的寫法可能會攜帶上兩個 Access-Control-Allow-Origin ,這種情況也是不允許的,下面會說到。所以配置適當修改如下:

server?{    listen       22222;    server_name  localhost;    location  / {        if ($request_method = 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080';            add_header Access-Control-Allow-Headers 'authorization';            return 204;        }        if ($request_method != 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080' always;        }        proxy_pass  http://localhost:59200;     }}

還沒完,繼續(xù)聊 ↓↓

情況4:

比較早期的API可能只用到了POST和GET請求,而Access-Control-Allow-Methods這個請求響應頭跨域默認只支持POST和GET,當出現(xiàn)其他請求類型時候,同樣會出現(xiàn)跨域異常。

比如,我這里將請求的API接口請求方式從原來的GET改成PUT,再發(fā)起一次試試。在控制臺上會拋出錯誤:

Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy:?Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

報錯內容也講的很清楚,在這個預請求中,PUT方法是不允許在跨域中使用的,我們需要改下Access-Control-Allow-Methods的配置(缺什么加上么,這里我只加了PUT,可以自己加全一點),讓瀏覽器知道服務端是允許的。

server?{    listen 22222;    server_name localhost;    location / {        if ($request_method = 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080';            add_header Access-Control-Allow-Headers 'content-type,authorization';            add_header Access-Control-Allow-Methods 'PUT';#為這么只加在這個if中,不再下面的if也加上?因為這里只有預檢請求會校驗,當然你加上也沒事。            return 204;        }        if ($request_method != 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080' always;        }        proxy_pass http://localhost:59200;    }}

這里注意一下,改成PUT類型后,Access-Control-Allow-Headers請求響應頭又會自動校驗content-type這個請求頭,和情況3是一樣的,缺啥補啥就行了。如果不加上content-type,則會報如下錯誤。(想簡單的話,Access-Control-Allow-Headers和Access-Control-Allow-Methods可以設置為?* ,表示全都匹配。但是Access-Control-Allow-Origin就不建議設置成 * 了,為了安全考慮,限制域名是很有必要的。)

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

都加上后,問題就解決了,這里報405是我服務端這個接口只開放了GET,沒有開放PUT,而此刻我將此接口用PUT方法去請求,所以接口會返回這個狀態(tài)碼。

情況5:

最后再說一種情況,就是后端處理了跨域,就不需要自己再處理了(這里吐槽下,某些后端工程師自己改服務端代碼解決跨域,但是又不理解其中原理,網(wǎng)上隨便找段代碼黏貼,導致響應信息可能處理不完全,如method沒添加全,headers沒加到點上,自己用的那個可能復制過來的并不包含實際項目所用到的,沒有添加options請求返回狀態(tài)碼等,導致Nginx再用通用的配置就會可能報以下異常)

Access to XMLHttpRequest at 'http://localhost:22222/api/Login/TestGet' from origin 'http://localhost:8080' has been blocked by CORS policy:?The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:8080', but only one is allowed.

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

nginx代理跨域,nginx,運維,后端,數(shù)據(jù)庫,java,spring boot

意思就是此刻Access-Control-Allow-Origin請求響應頭返回了多個,而只允許有一個,這種情況當然修改配置去掉Access-Control-Allow-Origin這個配置就可以了,不過遇到這種情況,建議Nginx配置和服務端自己解決跨域只選其一。(這里注意如果按我上面的寫法,if $request_method = 'OPTIONS' 這個里面的Access-Control-Allow-Origin可不能刪除,刪除!='OPTIONS'里面的就好了,因為這里如果是預檢請求直接就ruturn了,請求不會再轉發(fā)到59200服務,如果也刪除了,就會報和情況1一樣的錯誤。所以為什么說要不服務端代碼層面解決跨域,要不就Nginx代理解決,不要混著搞,不然不明白原理的人,網(wǎng)上找一段代碼貼就很可能解決不了問題)

???????

server?{    listen       22222;    server_name  localhost;    location  / {        if ($request_method = 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080';            add_header Access-Control-Allow-Headers '*';            add_header Access-Control-Allow-Methods '*';            add_header Access-Control-Allow-Credentials 'true';            return 204;        }        if ($request_method != 'OPTIONS') {            add_header Access-Control-Allow-Origin 'http://localhost:8080' always;            add_header Access-Control-Allow-Credentials 'true';        }        proxy_pass  http://localhost:59200;     }}

或者:

server {    listen       22222;    server_name  localhost;    location  / {        add_header Access-Control-Allow-Origin 'http://localhost:8080' always;        add_header Access-Control-Allow-Headers '*';        add_header Access-Control-Allow-Methods '*';        add_header Access-Control-Allow-Credentials 'true';        if ($request_method = 'OPTIONS') {            return 204;        }        proxy_pass  http://localhost:59200;     }}
 

最后,這是一篇解決跨域遇到問題解決問題的過程,如果認真看完了,我相信應該都能很容易的理解,并且在實際使用中自己解決該問題,希望能幫助到大家,以上內容都是自己理解自己測試碼出來的,如有理解不對的地方,望大家指正。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-699876.html

到了這里,關于Nginx 代理解決跨域問題分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 解決Origin請求頭導致的Nginx反向代理403跨域問題

    解決Origin請求頭導致的Nginx反向代理403跨域問題

    頁面通過域名A【https://a.winfun.com】訪問接口,域名A通過Nginx服務進行反向代理,代理到域名B【http://b.winfun.com】,然后進行業(yè)務邏輯執(zhí)行。 時序圖: nginx配置: 接口返回Http狀態(tài)為403,出現(xiàn)跨域問題。 為了方便測試,我們直接將接口放到Postman中進行模擬測試,并帶上相關請求

    2024年02月12日
    瀏覽(92)
  • Nginx反向代理 跨域問題

    H5項目部署在自己服務器上,后端數(shù)據(jù)調用第三方。第三方不愿意解決跨域問題 1.H5項目部署在 a.com 2.H5項目的所有接口請求由第三方的 c.com 改為 b.com 。 3.反向代理用 b.com ,由 b.com 把所有請求轉發(fā)請求第三方的 c.com 。加上跨域請求頭 1. vue 本地開發(fā)有代理的問題,如果路徑不

    2024年02月16日
    瀏覽(14)
  • 瀏覽器同源策略導致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    瀏覽器同源策略導致跨域問題 No ‘Access-Control-Allow-Origin‘ header 原因及解決方式--(后端、nginx、前端)

    目錄 現(xiàn)象 原因 瀏覽器同源策略 導致結果: 解決方案 跨源資源共享(CORS) 各個端解決方法: 后端: 方式1:重載WebMvcConfigurer方法 方式2:配置監(jiān)聽CorsFilter 方式3:相關類上加注解?@CrossOrigin 注意事項: Nginx解決: 情況1: 前端解決: 本人身份:后端 今天部署線上環(huán)境前端

    2024年01月23日
    瀏覽(25)
  • Nginx解決跨域問題

    Nginx解決跨域問題

    目錄 前言 一、跨域問題 1.什么是跨域 ?2.CORS 二、Nginx跨域處理 三.補充 這幾天出現(xiàn)了一個問題,我們中的一個A系統(tǒng)需要給B系統(tǒng)調用,造成了跨域問題。 1.什么是跨域 當一個請求url的協(xié)議、域名、端口三者之間任意一個與當前頁面url不同即為跨域。 ?2.CORS CORS是一個W3C標準,

    2024年02月16日
    瀏覽(21)
  • 使用Nginx解決跨域問題

    使用Nginx解決跨域問題

    目錄 使用Nginx解決跨域問題 1、修改瀏覽器、客戶端訪問地址 2、在nginx.conf配置文件需配置server 3、在Nginx中配置客戶端訪問的接口(按照規(guī)則或通配),并設置被代理的服務器 4、在Nginx中統(tǒng)一配置客戶端訪問的頭部信息(解決跨域問題) 5、在服務器端設置相應的頭部信息(

    2024年02月13日
    瀏覽(21)
  • Nginx跨域問題的解決方法

    Nginx跨域問題的解決方法

    Web前端開發(fā)經(jīng)常會遇到跨域訪問,如果沒有辦法讓后臺開放訪問域,調用接口就會被瀏覽器攔截。解決跨域問題的方案,可以搭建一個后臺服務做中間轉發(fā),也可以用 nginx https://so.csdn.net/so/search?q=nginx 轉發(fā)。 問題發(fā)生在nginx 反向代理 https://so.csdn.net/so/search?q=%E5%8F%8D%E5%90%91%E

    2024年02月11日
    瀏覽(22)
  • 使用nginx解決跨域問題(前端解決)

    使用nginx解決跨域問題(前端解決)

    情況是這樣的:編寫好的前端頁面本地打開是沒有問題的,請求都能發(fā)出去,接收到正確的響應結果。但是,使用nginx來部署這個頁面就會出現(xiàn)跨域問題。 跨域 :由于瀏覽器的同源策略,即屬于不同域的頁面之間不能相互訪問各自的頁面內容 注 :同源策略,單說來就是同協(xié)

    2024年02月11日
    瀏覽(24)
  • 微服務Gateway網(wǎng)關(自動定位/自定義過濾器/解決跨域)+nginx反向代理gateway集群

    微服務Gateway網(wǎng)關(自動定位/自定義過濾器/解決跨域)+nginx反向代理gateway集群

    目錄 Gateway網(wǎng)關 1.0.為什么需要網(wǎng)關? 1.1.如何使用gateway網(wǎng)關 1.2.網(wǎng)關從注冊中心拉取服務 1.3.gateway自動定位 1.4.gateway常見的斷言 1.5.gateway內置的過濾器 1.6.自定義過濾器-全局過濾器 1.7.解決跨域問題 2.nginx反向代理gateway集群 2.1.配置文件 繼? nacos注冊中心+Ribbon負載均衡+完成

    2024年02月06日
    瀏覽(43)
  • 巧用Nginx配置解決跨域問題

    巧用Nginx配置解決跨域問題

    1,前端頁面放在域名根目錄,比如,http://www.xuecheng.com/ ,對應的nginx配置: 頁面目錄: 2,前端請求接口路徑,在域名后面加一個目錄 nginx 對api接口配置 其中的 $http_origin并不是nginx的內置參數(shù),nginx支持取自定義的參數(shù)值,$http_XXX這個格式是nginx取請求中header的XXX的值的。這

    2023年04月11日
    瀏覽(26)
  • nginx 配置解決前端跨域問題

    一、為什么會出現(xiàn)跨域問題 ? ? ? ?出于瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略

    2023年04月22日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包