Nginx rewrite和proxy_pass的區(qū)別及說明
Nginx rewrite和proxy_pass的區(qū)別
收到一個(gè)需求,訪問 www.a.com/MP_verify_aa.txt(此文件是微信驗(yàn)證文件,驗(yàn)證啥我也不知道)需要轉(zhuǎn)發(fā)到 www.b.com/MP_verify_aa.txt 上。
文件名固定是以 MP_verify 開頭,(.txt) 結(jié)尾。(其實(shí)很簡單,但還是搞了很久,對nginx還是不熟悉,特寫此筆記,謹(jǐn)記。)
一開始,我想當(dāng)然,用rewrite 重定向。
以下是我一開始的配置
location ~* /MP_verify.*\.txt { rewrite ^/(MP_verify.*\.txt) https://www.b.com$request_uri permanent; }
nginx 正則匹配到uri后,重定向到 www.b.com/MP_verify_aa.txt,訪問沒啥問題,但是問題來了,瀏覽器中的主機(jī)地址變成了 www.b.com,為什么呢?
原因:rewrite 是對用戶請求的URI進(jìn)行PCRE正則重寫,然后返回 30x 重定向跳轉(zhuǎn)或按條件執(zhí)行相關(guān)配置。
但是,前端小伙伴要求是保持url不變。所以只能用nginx反向代理了。
注意,www.b.com 這個(gè)域名必須要讓服務(wù)器能解析到。
修改配置文件
location ~* /MP_verify.*\.txt { # rewrite ^/MP_verify.*\.txt http://www.b.com$request_uri permanent; proxy_next_upstream error timeout http_503 http_504 http_502; proxy_connect_timeout 500s; proxy_read_timeout 500s; proxy_send_timeout 500s; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;; proxy_pass https://www.b.com ; #跳轉(zhuǎn),注意這里域名后面不能加/,不然nginx reload會(huì)報(bào)錯(cuò)。 }
心得:
proxy_pass主要應(yīng)用于分發(fā)于后端的服務(wù)器,作為代理或者是負(fù)載均衡使用,在進(jìn)行分發(fā)請求的時(shí)候,用戶請求的URL不會(huì)發(fā)生變化,返回的狀態(tài)碼也基本上為200。
rewrite主要用于捕捉用戶請求的URL路徑中特殊元素,并且沒有對應(yīng)的NGINX的變量來替換的時(shí)候,或者需要在路徑中增加修改刪除元素,那么就可以使用rewrite。rewrite 會(huì)改變用戶請求的URL,且 rewrite指令只能返回301和302。
Nginx服務(wù)rewrite、proxy_pass
Nginx 是一個(gè)高性能的開源反向代理服務(wù)器,可以用于處理跨域請求、負(fù)載均衡和緩存等功能。在本文中,我們將介紹如何使用 Nginx 配置文件來實(shí)現(xiàn)反向代理。
我們可以實(shí)現(xiàn)跨域請求的處理,同時(shí)保護(hù)用戶的隱私和安全。此外,Nginx 還可以通過添加其他配置指令來實(shí)現(xiàn)更多功能,如負(fù)載均衡和緩存等。
用戶訪問 a.com/test/viewtt/onhyevbloi......
需要請求到 b.com/viewtt/onhyevbloi...... 去除 test
server { listen 80; server_name a.com; location /test/{ rewrite ^/test/(.*)$ /$1 break; proxy_pass http://b.com; } }
注意:?
- listen 80;:監(jiān)聽端口號 80,表示該服務(wù)器將接收來自客戶端的 HTTP 請求。
- server_name a.com;:指定該服務(wù)器的域名為 a.com,表示當(dāng)客戶端請求的域名為 a.com 時(shí),將使用該服務(wù)器進(jìn)行處理。
- location /test/:匹配以 /test/ 開頭的請求路徑。
- rewrite ^/test/(.*)$ /$1 break;:將匹配到的請求路徑中的 /test/ 替換為空,即去掉 /test/ 部分,然后繼續(xù)處理后續(xù)的指令。
- proxy_pass http://b.com;:將經(jīng)過重寫后的請求轉(zhuǎn)發(fā)到 http://b.com,即將請求代理到 http://b.com 上進(jìn)行處理。
總體來說,這段配置的作用是將客戶端請求中以 /test/ 開頭的路徑重寫為去掉 /test/ 部分的路徑,并將重寫后的請求轉(zhuǎn)發(fā)到 http://b.com 進(jìn)行處理。
1.用戶發(fā)起請求a.com/test/viewtt/onhyevbloi...... 最后會(huì)轉(zhuǎn)換成什么
根據(jù)上面的配置,當(dāng)用戶發(fā)起請求 a.com/test/viewtt/onhyevbloi...... 時(shí),經(jīng)過重寫和轉(zhuǎn)發(fā)后,最終會(huì)轉(zhuǎn)換成 b.com/test/viewtt/onhyevbloi......
具體的轉(zhuǎn)換過程如下:
- 用戶發(fā)起請求 a.com/test/viewtt/onhyevbloi......
- 根據(jù)配置中的 location /test/,匹配到請求路徑中以 /test/ 開頭的部分。
- 根據(jù) rewrite ^/test/(.*)$ /$1 break;,將匹配到的 /test/ 替換為空,得到 /viewtt/onhyevbloi......
- 根據(jù) proxy_pass http://b.com;,將重寫后的請求轉(zhuǎn)發(fā)到 http://b.com。
- 最終,用戶的請求被轉(zhuǎn)發(fā)到 http://b.com/test/viewtt/onhyevbloi......
2. 用戶瀏覽器框上顯示的是那個(gè)域名
- 根據(jù)上述配置,當(dāng)用戶在瀏覽器地址欄中輸入 a.com/test/viewtt/onhyevbloi...... 并發(fā)送請求時(shí),瀏覽器地址欄上顯示的仍然是 a.com/test/viewtt/onhyevbloi......。
- 這是因?yàn)?Nginx 的配置中只是將請求轉(zhuǎn)發(fā)到了 http://b.com/test/viewtt/onhyevbloi...... ,但瀏覽器并不會(huì)自動(dòng)更新地址欄顯示的內(nèi)容。
- 所以,用戶在瀏覽器地址欄上看到的仍然是原始的請求地址 a.com/test/viewtt/onhyevbloi...... 。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Nginx中l(wèi)ocation proxy_pass加與不加/的區(qū)別說明
- Nginx?location和proxy_pass配置示例詳解
- Nginx中proxy_pass的斜杠的兩種方式
- Nginx的location路徑與proxy_pass匹配規(guī)則說明
- Nginx捕獲并自定義proxy_pass返回的錯(cuò)誤問題
- nginx中如何配置proxy_pass
- Nginx proxy_pass如何到https后端
- nginx代理參數(shù)proxy_pass的實(shí)現(xiàn)
- nginx反向代理proxy_pass遇到的死循環(huán)問題
- 解決nginx配置proxy_pass之后,響應(yīng)變慢的問題
- Nginx使用if指令實(shí)現(xiàn)多個(gè)proxy_pass方式
- Nginx中proxy_pass使用小結(jié)
相關(guān)文章
Nginx中配置用戶服務(wù)器訪問認(rèn)證的方法示例
這篇文章主要介紹了Nginx中配置用戶服務(wù)器訪問認(rèn)證的方法示例,包括一個(gè)用perl腳本來實(shí)現(xiàn)的方法,需要的朋友可以參考下2016-01-01Nginx配置網(wǎng)站適配PC和手機(jī)的幾種方法
在開發(fā)中,我們常常會(huì)遇到需要根據(jù)用戶設(shè)備的不同,返回對應(yīng)樣式的頁面,本文主要介紹了Nginx配置網(wǎng)站適配PC和手機(jī)的幾種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08使用Nginx實(shí)現(xiàn)301跳轉(zhuǎn)至https的根域名示例代碼
這篇文章主要介紹了使用Nginx實(shí)現(xiàn)301跳轉(zhuǎn)至https的根域名,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Nginx與后臺(tái)應(yīng)用端口沖突的解決方案
在部署Web應(yīng)用時(shí),Nginx和后臺(tái)應(yīng)用(如Node.js、Python Flask、Java Spring Boot等)常常需要同時(shí)運(yùn)行在一臺(tái)服務(wù)器上,然而,當(dāng)它們需要監(jiān)聽同一個(gè)端口(如8000)時(shí),就會(huì)出現(xiàn)端口沖突的問題,本文將詳細(xì)介紹幾種解決Nginx與后臺(tái)應(yīng)用端口沖突的方法2025-02-02Nginx?Rewrit實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能詳細(xì)步驟
Rewrite主要實(shí)現(xiàn)url地址重寫,以及重定向,就是把傳入web的請求重定向到其他url的過程,這篇文章主要介紹了Nginx?Rewrit實(shí)現(xiàn)網(wǎng)頁跳轉(zhuǎn)功能詳細(xì)步驟,需要的朋友可以參考下2024-02-02