摘要:只是只是,不包含任何路徑,比如這種情況下,會把匹配到的所有路徑直接穿透轉發。比如以下的配置訪問后端結果為您的請求地址是包含路徑這里的路徑哪怕只是一個也是存在的,如這種情況下,里面會去掉匹配的字符串,拼接到再進行轉發。
今天上了一個多頁應用,發現接口轉發后是 401。 最后發現是接口轉發出錯了。地址里多拼了一個 路徑。 以前我一直以為location 字段會替換掉 proxy_pass 里面配置的 url 地址。 今天了解了一下 發現還是有不少細節的。
// node js 文件,打印請求路徑。方便查看后端真實接受到的請求地址 const http = require("http"); http.createServer((req, res) => { console.log(req.url); res.end(`您的 請求 地址是${req.url}`); }).listen(3000);
proxy_pass 如何轉發,首先看 proxy_pass 的url 配置。
proxy_pass 只是HOSTproxy_pass 只是HOST,不包含任何路徑,比如
* http://host - √ * https://host - √ * http://host:port - √ * https://host:port - √ * http://host/ - x * http://host:port/ - x
這種情況下,會把匹配到的所有路徑直接穿透轉發。比如以下的配置
location /api/ { proxy_pass http://127.0.0.1:3000; }
訪問 http://127.0.0.1:80/api/cc, 后端結果為 您的 請求 地址是/api/cc
proxy_pass 包含路徑這里的路徑哪怕只是一個 / 也是存在的,如:
http://host - x
https//host/ - √
http://host:port- x
https://host:port/ - √
http://host/api - √
http://host/api/ - √
這種情況下,url 里面會去掉 location 匹配的字符串,拼接到 proxy_pass 再進行轉發。
location /api/ { proxy_pass http://127.0.0.1:3000/; }
訪問 http://127.0.0.1:81/api/cc, 后端結果為 您的 請求 地址是/cc
重寫代理鏈接 - url rewrite使用 rewrite 指令并且生效后,proxy_pass url 鏈接中的路徑會被忽略,如:
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 得到 您的 請求 地址是/node/bb/cc(匹配上 / 了,沒有匹配 rewrite)
訪問 http://127.0.0.1:83/api/cc 得到 您的 請求 地址是/fixpath=cc (我們寫的 proxy_pass http://127.0.0.1:3000/node/ 里面的 node路徑丟失了 )
知道了這幾點,碰到轉發接口也有一點底氣啦~
更多在github上看到的這本小書 ??
(參考資料)[https://xuexb.github.io/learn...]
我的 nginx 配置
events { } http { # proxy_pass url 只是 host # 這時候 location 匹配的完整路徑將直接透傳給 url ,如: server { listen 80; location / { proxy_pass http://127.0.0.1:3000; } location /api/ { proxy_pass http://127.0.0.1:3000; } } # url 包含路徑 # 當 proxy_pass url 的 url 包含路徑時,匹配時會根據 location 的匹配后的鏈接透傳給 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; } } # 當 location 以正則形式匹配時,proxy_pass 就不能以 / 結束了,也就是不能包含路徑了, 會提示配置錯誤,比如錯誤的: 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 鏈接中的路徑會被忽略,如: 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/; } } }
測試流程 : node 運行 服務, 啟動Nginx 轉發 , 再用postman 發送請求。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40604.html
摘要:部署項目寫在前面作為輕量級虛擬化技術,擁有持續集成版本控制可移植性隔離性和安全性等優勢。容器可以被創建啟動停止刪除暫停等。重新運行應用容器直接基于鏡像來啟動容器,運行命令將宿主機的掛載到容器的目錄上。Docker 部署 vue 項目 1.寫在前面: Docker 作為輕量級虛擬化技術,擁有持續集成、版本控制、可移植性、隔離性和安全性等優勢。本文使用Docker來部署一個vue的前端應用,并盡...
摘要:同時由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時,發現網上有些方案的確是存在一些問題,在這里總結一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨立提供頁面和靜態服務很自然的就想到了用nginx去做靜態服務器。同時由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時,發現網上有些方案的確是存在一些問題,在這里總結一下基本配置...
摘要:同時由于跨域了,就想利用的反向代理去處理一下跨域,但是在解決問題的同時,發現網上有些方案的確是存在一些問題,在這里總結一下基本配置,也聊一下常見的配置問題。 最近公司前后端分離,前端獨立提供頁面和靜態服務很自然的就想到了用nginx去做靜態服務器。同時由于跨域了,就想利用nginx的反向代理去處理一下跨域,但是在解決問題的同時,發現網上有些方案的確是存在一些問題,在這里總結一下基本配置...
摘要:同時若不想破壞已經做好的的話,也可以不使用,直接轉發到服務器的內網應該也是可以的。這樣在安全和效率高上就都能得到一定的提升。 之前寫了一些nginx的東西,這次繼續,主要使用upstream針對proxy_pass轉發做個處理一般情況下我們在使用nginx反向代理的時候,都是如下配置, ... location /api { proxy_pass https://b.test.c...
摘要:一產生跨域的原因瀏覽器限制跨域請求二解決思路解決跨域有多重,在這里主要講用解決跨域代理瀏覽器禁止檢查跨域三下載安裝下載地址選擇其中一個版本下載,再解壓即可使用在目錄下輸入,若出現版本號,則安裝成功四反向代理解決跨域客戶端解決跨域我們使用的 一. 產生跨域的原因 1.瀏覽器限制 2.跨域 3.XHR(XMLHttpRequest)請求 二. 解決思路 解決跨域有多重,在這里主要講用ngi...
閱讀 2786·2021-11-17 09:33
閱讀 2168·2021-09-03 10:40
閱讀 522·2019-08-29 18:45
閱讀 2955·2019-08-29 16:21
閱讀 612·2019-08-29 11:11
閱讀 3393·2019-08-26 12:00
閱讀 2946·2019-08-23 18:19
閱讀 1092·2019-08-23 12:18