0. 引言
我們在日常的生產(chǎn)過程中,常常有需要重定向轉(zhuǎn)發(fā)的需求,比如企業(yè)更換了域名,但又要保證之前的域名能訪問,這就需要做重定向的跳轉(zhuǎn)。
我們在之前的章節(jié)中學(xué)習(xí)了Nginx的負載均衡、各類轉(zhuǎn)發(fā)代理配置,今天繼續(xù)來補充關(guān)于轉(zhuǎn)發(fā)的的最后一個環(huán)節(jié)——重定向(或稱跳轉(zhuǎn))
1. 重定向、重寫詳解
什么是重定向?
重定向是指將客戶端的請求從一個URL自動重定向到另一個URL。這通常是通過服務(wù)器發(fā)送一個特定的HTTP狀態(tài)碼來完成的,告訴客戶端(以及搜索引擎)資源已經(jīng)移動到了新的位置。重定向可以是臨時的(302 Found)或永久的(301 Moved Permanently)
一句話概括:重定向轉(zhuǎn)發(fā)時瀏覽器上的地址是會變化的,客戶是能感知到的
什么是重寫?
重寫是指在不改變URL的情況下,修改客戶端請求的HTTP請求行(request line)或路徑。這通常用于URL的標(biāo)準(zhǔn)化或修改,而不需要告訴客戶端資源已經(jīng)移動。重寫通常在服務(wù)器配置文件中完成,例如在Nginx的rewrite指令中。
一句話概括:重寫轉(zhuǎn)發(fā)時瀏覽器上的地址是會不會變化的,客戶是無感的
應(yīng)用場景:
重定向用于告訴客戶端資源已經(jīng)移動到了新位置
重寫用于在不改變客戶端URL的情況下修改請求
1.1 return 詳解
1.1.1 return 核心概念
介紹:
return指令用于立即結(jié)束當(dāng)前處理塊的執(zhí)行,并返回一個狀態(tài)碼給客戶端。這個狀態(tài)碼可以是204(No Content)、400(Bad Request)到500(Server Error)之間的任何值。
return通常用于訪問控制、錯誤處理或配置特定的HTTP響應(yīng)
該指令可以返回指定的響應(yīng)碼和重定向URL給客戶端,也可以返回指定的響應(yīng)碼和文本給客戶端
作用域:
server, location, if
語法:
return code [text];
return code URL;
return URL;
return的狀態(tài)碼為301、302、303、307、308時,則為重定向;
return的狀態(tài)碼為其他時,可以返回響應(yīng)主體[text]。
1.1.2 return 案例
官方文檔:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
- 1、返回指定狀態(tài)碼和文本
如果要返回文本,需要指定 default_type application/json;,不配置的話,跳轉(zhuǎn)會默認以下載文件形式
location ~ /user {
default_type application/json;
return 200 "跳轉(zhuǎn)成功";
}
- 2、重定向到指定鏈接
重定向分為臨時重定向和永久重定向:
永久重定向:
301,308 表示永久重定向,重定向結(jié)果會緩存,下次請求直接從緩存獲??;區(qū)別在于301會進行方法轉(zhuǎn)變,比如一個POST提交的請求,會轉(zhuǎn)換為GET請求轉(zhuǎn)發(fā),而308則會保持原本方法進行轉(zhuǎn)發(fā)
臨時重定向:
300,該請求有多種可能的響應(yīng),瀏覽器可以選擇它們其中的一個。服務(wù)器沒有任何標(biāo)準(zhǔn)可以遵循去代替用戶來進行選擇
302,重定向請求轉(zhuǎn)發(fā)時使用 GET 方法,不管原請求使用的是何種方法
303,基本跟 302 一致,所以很少用 303,都是使用 302
307,為了補充 302.重定向必須使用原請求的方法和包體訪問
location /user/ {
return 300 "http://www.baidu.com";
}
或者
location /user/ {
return "http://www.baidu.com";
}
3、返回一個自定義頁面,并將參數(shù)、uri打印出來
location /test {
default_type text/html;
set $name 跳轉(zhuǎn)成功;
return 200 <html><p>$name</p><p>request_uri:$request_uri</p><p>document_uri:$document_uri</p><p>uri:$uri</p><p>query_string:$query_string</p><p>args:$args</p></html>;
}
注意,要讓nginx支持顯示中文,需要在nginx.conf
中配置:
http {
...
charset utf-8;
}
1.2 rewrite 詳解
1.2.1 rewrite 核心概念
官方文檔:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
介紹:
Nginx 的 rewrite 模塊是一個功能豐富的組件,它使得用戶能夠通過正則表達式對請求的 URI 進行重寫。rewrite 模塊支持 PCRE(Perl Compatible Regular Expressions)正則表達式,這為用戶提供了強大的匹配和重寫能力。通過正則表達式,用戶可以精確地控制哪些請求需要被重寫以及重寫后的 URI。同時,rewrite 模塊還提供了一系列的標(biāo)記(flag),如 last、break、redirect、permanent 等,以控制重寫后的行為,例如是否繼續(xù)執(zhí)行后續(xù)的重寫規(guī)則、是否返回重定向響應(yīng)等。這個功能通常用于以下幾種場景:
- URL 規(guī)范化:使 URL 看起來更規(guī)范、合理,便于用戶記憶和搜索引擎優(yōu)化。
- 動態(tài) URL 地址偽裝:企業(yè)常常將動態(tài) URL 地址偽裝成靜態(tài)地址提供服務(wù),以提高系統(tǒng)的負載能力和用戶體驗。
- 域名更換:當(dāng)網(wǎng)站更換域名時,可以通過 rewrite 指令將舊域名的訪問跳轉(zhuǎn)到新域名上,確保用戶的訪問不會受到影響。
- 業(yè)務(wù)調(diào)整:在服務(wù)端進行某些業(yè)務(wù)調(diào)整時,可能需要通過重寫 URL 來實現(xiàn)特定的訪問控制或數(shù)據(jù)分發(fā)。
作用域:
server, location, if
語法:
rewrite regex replacement [flag];
可選的flag參數(shù):
- last
標(biāo)記表示在執(zhí)行了當(dāng)前的重寫規(guī)則后,繼續(xù)執(zhí)行后續(xù)的 rewrite 規(guī)則或 location 匹配。
它通常用在 server 塊或 if 塊中,以確保重寫規(guī)則可以與其他規(guī)則組合使用,形成一個規(guī)則鏈。
- break
標(biāo)記表示在執(zhí)行了當(dāng)前的重寫規(guī)則后,停止執(zhí)行后續(xù)的所有 rewrite 規(guī)則。
它通常用在 location 塊中,用于確保一旦某個重寫規(guī)則匹配并執(zhí)行后,不會繼續(xù)執(zhí)行其他可能存在的重寫規(guī)則。
- redirect:
標(biāo)記表示重寫規(guī)則執(zhí)行后,返回一個重定向響應(yīng)(HTTP 302 狀態(tài)碼)給客戶端,而不是繼續(xù)處理請求。
它用于實現(xiàn)臨時性的重定向,比如在網(wǎng)站維護時將用戶重定向到另一個地址。
- permanent
標(biāo)記表示重寫規(guī)則執(zhí)行后,返回一個永久重定向響應(yīng)(HTTP 301 狀態(tài)碼)給客戶端,并且后續(xù)的請求應(yīng)該直接跳轉(zhuǎn)到新的 URI,而不是再次執(zhí)行重寫規(guī)則。
它用于實現(xiàn)永久性的重定向,比如在域名更改后,將舊域名重定向到新域名。
301和302的應(yīng)用場景:
302 需要經(jīng)常變化跳轉(zhuǎn)路徑的uri則使用302
301 基本不變的調(diào)整uri(http跳轉(zhuǎn)https、seo)
1.2.2 rewrite 案例
1、替換舊域名xxx.com為新域名yyy.com
server {
listen 80;
server_name www.xxx.com; #域名修改
charset utf-8;
location / {
#添加域名重定向
if ($host = 'www.xxx.com'){ #$host為rewrite全局變量,代表請求主機頭字段或主機名
rewrite ^/(.*)$ http://www.yyy.com/$1 permanent; #$1為正則匹配的內(nèi)容,即“域名/”之后的字符串
}
root html;
index index.html index.htm;
}
2、舊域名訪問/user/
的請求跳轉(zhuǎn)新域名,并且訪問在路徑上添加/new/
server {
listen 80;
server_name www.xxx.com;
charset utf-8;
#添加
locatoin /user/ {
rewirte (.+) http://www.newxxx.com/new$1 permanent; #這里的$1為位置變量,代表/user/
}
locaiton / {
root html;
index index.html index.htm;
}
}
3、將動態(tài)鏈接改為偽靜態(tài)鏈接(看起來像是靜態(tài)鏈接的地址)
用戶訪問:www.xxx.com/user/view/3/index.html
實際地址:http://www.xxx.com/user/index.jsp?post=3&action=view
location ~ /user/view {
rewrite /user/(.*)/(.*)/(.*).html /user/$3.jsp?post=$2&action=$1 last;
}
$N 表示第幾個括號中的變量
4、業(yè)務(wù)新版本上線,要求所有 IP 訪問任何內(nèi)容都顯示一個維護頁面,只有允許 IP 192.168.244.2訪問后臺業(yè)務(wù)
先創(chuàng)建維護頁面
ehho "<h1>系統(tǒng)升級中... 持續(xù)時間 2023-12-24 23:00:00 -2023-12-24 23:50:00 </h1>" > /var/www/html/system.html
修改配置
server {
listen 80;
server_name www.xxx.com;
charset utf-8; # 顯示中文
# 是否轉(zhuǎn)發(fā)標(biāo)記
set $rewrite true; #設(shè)置變量$rewrite,變量值為boole值true
# 是否為內(nèi)部IP
if ($remote_addr = "192.168.244.2"){
set $rewrite false;
}
# 跳轉(zhuǎn)維護頁面
if ($rewrite = true){
rewirte (.+) /system.html; #將域名后邊的路徑重寫成/system.html
}
location = /system.html {
root /var/www/html; #網(wǎng)頁返回維護頁面
}
location / {
root html;
index index.html index.htm;
}
}
5、項目升級,但部分jsp鏈接未升級,需要將所有.jsp
訪問轉(zhuǎn)發(fā)到原項目文章來源:http://www.zghlxwxcb.cn/news/detail-828657.html
location ~* .*\.jsp {
rewrite (.+) http://www.old.xxx.com$1 permanent;
}
2. 總結(jié)
本章,我們重點講解了重定向和重寫的區(qū)別,并且講解了return,rewrite的用法,用實際的案例進行了演示,下一節(jié)我們將展示nginx如何實現(xiàn)企業(yè)安全防護文章來源地址http://www.zghlxwxcb.cn/news/detail-828657.html
到了這里,關(guān)于Nginx快速入門:return、rewrite重定向、重寫詳解(六)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!