成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nginx 之 proxy_pass 接口轉(zhuǎn)發(fā)的規(guī)則

jas0n / 3955人閱讀

摘要:只是只是,不包含任何路徑,比如這種情況下,會(huì)把匹配到的所有路徑直接穿透轉(zhuǎn)發(fā)。比如以下的配置訪問后端結(jié)果為您的請(qǐng)求地址是包含路徑這里的路徑哪怕只是一個(gè)也是存在的,如這種情況下,里面會(huì)去掉匹配的字符串,拼接到再進(jìn)行轉(zhuǎn)發(fā)。

今天上了一個(gè)多頁應(yīng)用,發(fā)現(xiàn)接口轉(zhuǎn)發(fā)后是 401。 最后發(fā)現(xiàn)是接口轉(zhuǎn)發(fā)出錯(cuò)了。地址里多拼了一個(gè) 路徑。 以前我一直以為location 字段會(huì)替換掉 proxy_pass 里面配置的 url 地址。 今天了解了一下 發(fā)現(xiàn)還是有不少細(xì)節(jié)的。

// node js 文件,打印請(qǐng)求路徑。方便查看后端真實(shí)接受到的請(qǐng)求地址
const http = require("http");
http.createServer((req, res) => {
  console.log(req.url);
  res.end(`您的 請(qǐng)求 地址是${req.url}`);
}).listen(3000);

proxy_pass 如何轉(zhuǎn)發(fā),首先看 proxy_pass 的url 配置。

proxy_pass 只是HOST

proxy_pass 只是HOST,不包含任何路徑,比如

* http://host - √
* https://host - √
* http://host:port - √
* https://host:port - √
* http://host/ - x
* http://host:port/ - x

這種情況下,會(huì)把匹配到的所有路徑直接穿透轉(zhuǎn)發(fā)。比如以下的配置

 location /api/ {
    proxy_pass http://127.0.0.1:3000;
 }

訪問 http://127.0.0.1:80/api/cc, 后端結(jié)果為 您的 請(qǐng)求 地址是/api/cc

proxy_pass 包含路徑

這里的路徑哪怕只是一個(gè) / 也是存在的,如:

http://host - x

https//host/ - √

http://host:port- x

https://host:port/ - √

http://host/api - √

http://host/api/ - √

這種情況下,url 里面會(huì)去掉 location 匹配的字符串,拼接到 proxy_pass 再進(jìn)行轉(zhuǎn)發(fā)。

 location /api/ {
    proxy_pass http://127.0.0.1:3000/;
 }

訪問 http://127.0.0.1:81/api/cc, 后端結(jié)果為 您的 請(qǐng)求 地址是/cc

重寫代理鏈接 - url rewrite

使用 rewrite 指令并且生效后,proxy_pass url 鏈接中的路徑會(huì)被忽略,如:

server {
            listen       83;
            location / {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
            location ^/api/ {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
        }

訪問 http://127.0.0.1:83/bb/cc 得到 您的 請(qǐng)求 地址是/node/bb/cc(匹配上 / 了,沒有匹配 rewrite)
訪問 http://127.0.0.1:83/api/cc 得到 您的 請(qǐng)求 地址是/fixpath=cc (我們寫的 proxy_pass http://127.0.0.1:3000/node/ 里面的 node路徑丟失了 )

知道了這幾點(diǎn),碰到轉(zhuǎn)發(fā)接口也有一點(diǎn)底氣啦~

更多

在github上看到的這本小書 ??
(參考資料)[https://xuexb.github.io/learn...]

我的 nginx 配置

events {
}
http {
    # proxy_pass url 只是 host
    # 這時(shí)候 location 匹配的完整路徑將直接透?jìng)鹘o url ,如:
     server {
            listen       80;
            
            location / {
                proxy_pass http://127.0.0.1:3000;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000;
            }
           
            
        }
    # url 包含路徑
    # 當(dāng) proxy_pass url 的 url 包含路徑時(shí),匹配時(shí)會(huì)根據(jù) location 的匹配后的鏈接透?jìng)鹘o url ,注意匹配后就是這樣:
     server {
            listen       81;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }

            location /api/ {
                proxy_pass http://127.0.0.1:3000/;
            }
            location /bpi/ {
                proxy_pass http://127.0.0.1:3000/v1;
            }
            location /cpi {
                proxy_pass http://127.0.0.1:3000/v1;
            }
        }
        # 當(dāng) location 以正則形式匹配時(shí),proxy_pass 就不能以 / 結(jié)束了,也就是不能包含路徑了, 會(huì)提示配置錯(cuò)誤,比如錯(cuò)誤的:

     server {
            listen       82;
            
            location / {
                proxy_pass http://127.0.0.1:3000/;
            }
        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /test.conf:47
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/;
        #     }

        # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /Users/tangdaoyuan/code/anheng/jz-bingjiang/test.conf:52
        #    location ~* ^/api/ {
        #         proxy_pass http://127.0.0.1:3000/b1;
        #     }
        }

    # 使用 rewrite 指令并且生效后,proxy_pass url 鏈接中的路徑會(huì)被忽略,如:
     server {
            listen       83;
            location / {
                proxy_pass http://127.0.0.1:3000/node/;
            }
            location ^/api/ {
                rewrite ^/api/(.*) /fixpath=$1 break;
                proxy_pass http://127.0.0.1:3000/node/;
            }
        }

}

測(cè)試流程 : node 運(yùn)行 服務(wù), 啟動(dòng)Nginx 轉(zhuǎn)發(fā) , 再用postman 發(fā)送請(qǐng)求。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40604.html

相關(guān)文章

  • [手把手系列]Docker 部署 vue 項(xiàng)目

    摘要:部署項(xiàng)目寫在前面作為輕量級(jí)虛擬化技術(shù),擁有持續(xù)集成版本控制可移植性隔離性和安全性等優(yōu)勢(shì)。容器可以被創(chuàng)建啟動(dòng)停止刪除暫停等。重新運(yùn)行應(yīng)用容器直接基于鏡像來啟動(dòng)容器,運(yùn)行命令將宿主機(jī)的掛載到容器的目錄上。Docker 部署 vue 項(xiàng)目 1.寫在前面: Docker 作為輕量級(jí)虛擬化技術(shù),擁有持續(xù)集成、版本控制、可移植性、隔離性和安全性等優(yōu)勢(shì)。本文使用Docker來部署一個(gè)vue的前端應(yīng)用,并盡...

    VPointer 評(píng)論0 收藏0
  • Nginx反向代理跨域基本配置與常見誤區(qū)

    摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨(dú)立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...

    lindroid 評(píng)論0 收藏0
  • Nginx反向代理跨域基本配置與常見誤區(qū)

    摘要:同時(shí)由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨(dú)立提供頁面和靜態(tài)服務(wù)很自然的就想到了用nginx去做靜態(tài)服務(wù)器。同時(shí)由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時(shí),發(fā)現(xiàn)網(wǎng)上有些方案的確是存在一些問題,在這里總結(jié)一下基本配置...

    JasonZhang 評(píng)論0 收藏0
  • Nginx反向代理升級(jí)--upstream改造proxy_pass

    摘要:同時(shí)若不想破壞已經(jīng)做好的的話,也可以不使用,直接轉(zhuǎn)發(fā)到服務(wù)器的內(nèi)網(wǎng)應(yīng)該也是可以的。這樣在安全和效率高上就都能得到一定的提升。 之前寫了一些nginx的東西,這次繼續(xù),主要使用upstream針對(duì)proxy_pass轉(zhuǎn)發(fā)做個(gè)處理一般情況下我們?cè)谑褂胣ginx反向代理的時(shí)候,都是如下配置, ... location /api { proxy_pass https://b.test.c...

    harryhappy 評(píng)論0 收藏0
  • nginx解決跨域問題

    摘要:一產(chǎn)生跨域的原因?yàn)g覽器限制跨域請(qǐng)求二解決思路解決跨域有多重,在這里主要講用解決跨域代理瀏覽器禁止檢查跨域三下載安裝下載地址選擇其中一個(gè)版本下載,再解壓即可使用在目錄下輸入,若出現(xiàn)版本號(hào),則安裝成功四反向代理解決跨域客戶端解決跨域我們使用的 一. 產(chǎn)生跨域的原因 1.瀏覽器限制 2.跨域 3.XHR(XMLHttpRequest)請(qǐng)求 二. 解決思路 解決跨域有多重,在這里主要講用ngi...

    Jeffrrey 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<