Nginx可以通過(guò)return和rewrite兩種方式來(lái)實(shí)現(xiàn)重定向,下面通過(guò)幾個(gè)例子簡(jiǎn)單演示下,如有錯(cuò)誤,還望指正一、使用return來(lái)實(shí)現(xiàn)重定向
- location:作用域?yàn)閘ocation中
- return url重定向 #臨時(shí)重定向,返回302
- return code “文本內(nèi)容” 返回狀態(tài)碼以及文本
本例子中使用Nginx和Jenkins來(lái)作為演示,他們都部署在同一臺(tái)機(jī)器上,端口分別為80和80801.1、下面例子使用第一種參數(shù)將url永久重定向到j(luò)enkins頁(yè)面,如圖:注意:return后面的http地址結(jié)尾有沒(méi)有”/”都沒(méi)關(guān)系,因?yàn)橹灰ヅ淞寺窂?jenkins就會(huì)請(qǐng)求過(guò)來(lái)接下來(lái)通過(guò)http://10.9.2.247/jenkins來(lái)請(qǐng)求,可以看到已經(jīng)重定向到j(luò)enkins頁(yè)面,如圖:1.2 、下面例子是使用第二種參數(shù)將url重定向到百度頁(yè)面,如圖:此時(shí)通過(guò)瀏覽器訪問(wèn)http://10.9.2.247/url/ 將重定向到百度頁(yè)面,查看返回狀態(tài)碼,如圖:1.3、下面例子是使用第三種參數(shù),返回狀態(tài)碼和文本,如圖:通過(guò)瀏覽器訪問(wèn)http://10.9.2.247/test 將下載test文件,查看此文件內(nèi)容如下:注意:return后面只有是200的時(shí)候才會(huì)下載,其余的不會(huì)return在server和if中用法基本差不多,不再過(guò)多演示二、使用rewirte實(shí)現(xiàn)重定向
- location:作用域?yàn)閘ocation中
rewrite regex replacement [flag]
last | 本條規(guī)則匹配完成后,不終止重寫后的url匹配,一般用在 server 和 if 中 |
break | 本條規(guī)則匹配完成即終止,終止重寫后的url匹配,一般使用在 location 中 |
redirect | 返回302臨時(shí)重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址 |
permanent | 返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址 |
演示例子之前我們先通過(guò)yum安裝一個(gè)httpd,然后修改端口為88,并修改默認(rèn)界面內(nèi)容如下:vim /var/www/html/index.html #this is a httpd pag
啟動(dòng)httpd后,通過(guò)瀏覽器訪問(wèn),如下:

本例子中Nginx和httpd都在同一臺(tái)機(jī)器,端口分別為80和88,下面舉幾個(gè)例子演示下,更多用法可查官方文檔或自行網(wǎng)絡(luò)查找研究1、下面例子中,請(qǐng)求路由為/,也就是默認(rèn)根路由,如圖:

此時(shí)通過(guò)瀏覽器訪問(wèn)http://10.9.2.247,可以看到已經(jīng)跳轉(zhuǎn)到httpd,如圖:

在不改變上圖中rewrite規(guī)則情況下,無(wú)論location中路由變成什么,最終都是重定向到httpd的默認(rèn)頁(yè)面2、在httpd默認(rèn)界面/var/www/html目錄下創(chuàng)建test目錄,添加index.html文件,內(nèi)容如下:mkdir -p /var/www/html/test
echo "this is a test page about httpd!!!" > /var/www/html/test/index.html
修改location和rewrite規(guī)則,如圖:

通過(guò)瀏覽器訪問(wèn)http://10.9.2.247/test ,查看瀏覽器響應(yīng)結(jié)果如下:

從上圖看出,當(dāng)請(qǐng)求路由為/test,實(shí)際是跳轉(zhuǎn)到了httpd根路徑下的test目錄的index.html文件,為什么會(huì)這樣呢?因?yàn)閞ewrite中的正則(.*) 前面并無(wú)其他內(nèi)容,因此此時(shí)匹配的就是上面的路由test,而$1正好對(duì)應(yīng)的是(.*)的內(nèi)容,因此實(shí)際請(qǐng)求路徑就變成了10.9.2.247:88/test注意:在rewrite的正則中,如果有$1、$2,那么實(shí)際匹配的是()中的內(nèi)容,比如:
rewrite /(abc)/(def) https://example.com/$1/$2
rewrite /abc/(def) https://example.comf/$1
3、修改上述rewrite規(guī)則,添加一段路徑,如圖:

此時(shí)通過(guò)瀏覽器請(qǐng)求http://10.9.2.247/test/index.html,將跳轉(zhuǎn)到httpd默認(rèn)路徑下的index.html,因?yàn)?1只能匹配括號(hào)的內(nèi)容,此時(shí)(.*)匹配的內(nèi)容就是index.html,因此實(shí)際重定向的路徑就是http://10.9.2.247:88/index.html,^/test表示匹配以test開頭的路由,location中是test,這里匹配的開頭也要是test,不能所以寫,會(huì)報(bào)錯(cuò)

注意:上面的location中路由是/test還是/test/對(duì)結(jié)果都沒(méi)有影響,$1只匹配括號(hào)里的4、修改rewrite規(guī)則,增加一個(gè)路徑abcd,再次查看結(jié)果,如圖:

瀏覽器中輸入http://10.9.2.247/test/abcd/index.html,實(shí)際重定向的路徑是http://10.9.2.247:88/index.html,因?yàn)?1匹配的只是()中的內(nèi)容,如圖:

注意:rewrite中的路由有test,location中路由也有test,此時(shí)rewrite中的test會(huì)覆蓋location中test5、修改location路由和rewrite規(guī)則,如圖:

從上圖看出location路由和rewrite路由不同,此時(shí)請(qǐng)求的時(shí)候需要將rewrite路由一起加上,請(qǐng)求路徑http://10.9.2.247/test/def/abcd/index.html將重定向到http://10.9.2.247:88/index.html,如圖:

注意看,上面的rewrite的/abcd/前面是沒(méi)有”^”的,如果加了這個(gè)”^”后,再按照上面的路徑請(qǐng)求就會(huì)異常,因?yàn)椤盺”表示匹配開頭,加了后表示請(qǐng)求路由以abcd開頭,那么請(qǐng)求路徑就會(huì)變成http://10.9.2.247/abcd/index.html,但是location中也沒(méi)有abcd這個(gè),所以請(qǐng)求也不會(huì)成功,因此要么不加”^”,在請(qǐng)求的時(shí)候直接將rewrite路由加在location路由后面,要不就像上面2.4中的那樣,把location的路由也寫在rewrite中,并加前綴”^”匹配6、下面例子使用$1和$2獲取兩個(gè)參數(shù),如圖:

瀏覽器請(qǐng)求http://10.9.2.247/test/def/abc/abc.html,結(jié)果如下:

上圖中的rewrite有兩個(gè)括號(hào)內(nèi)容,那么將分別對(duì)應(yīng)$1和$2,因此實(shí)際請(qǐng)求將匹配到http://10.9.2.247:88/abc/abc.html

通過(guò)瀏覽器訪問(wèn)www.def.com,可以看到跳轉(zhuǎn)到了Nginx的默認(rèn)界面,如圖:

通過(guò)瀏覽器訪問(wèn)www.abc.com,可以看到重定向到httpd頁(yè)面,如圖:

修改Nginx配置文件,將rewrite放在server中,如圖:

上圖中將rewrite放在server中,那么此時(shí)這個(gè)重定向?qū)?duì)全局生效,此時(shí)通過(guò)域名訪問(wèn)將重定向到httpd的默認(rèn)界面,如圖:

閱讀原文:原文鏈接
該文章在 2025/7/1 23:21:01 編輯過(guò)