在Nginx中實(shí)現(xiàn)URL重寫與重定向
URL 重寫(Rewrite)
Nginx 的 **URL 重寫(Rewrite)**功能允許你根據(jù)請(qǐng)求的 URL 動(dòng)態(tài)地修改請(qǐng)求路徑或進(jìn)行重定向。通過 URL 重寫,你可以實(shí)現(xiàn)諸如:
- 友好 URL:將復(fù)雜的 URL 轉(zhuǎn)換為簡(jiǎn)潔、易記的形式。
- 301/302 重定向:實(shí)現(xiàn)頁面永久或臨時(shí)重定向。
- 條件重寫:基于不同的條件(如請(qǐng)求頭、IP 地址、用戶代理等)修改請(qǐng)求路徑。
本文將詳細(xì)介紹如何在 Nginx 中實(shí)現(xiàn) URL 重寫,并給出一些常見的實(shí)際場(chǎng)景。
Nginx 中的 URL 重寫指令
Nginx 中的 URL 重寫主要依賴于兩個(gè)指令:
rewrite
:用于修改請(qǐng)求的 URL。try_files
:嘗試一系列的文件路徑,并在文件不存在時(shí)重寫 URL。
rewrite 指令
rewrite 指令允許你根據(jù)正則表達(dá)式重寫 URL。其基本語法如下:
rewrite <匹配規(guī)則> <重寫目標(biāo)> [標(biāo)志];
匹配規(guī)則:正則表達(dá)式,匹配請(qǐng)求的 URL。
重寫目標(biāo):新的 URL,符合規(guī)則時(shí),Nginx 會(huì)將請(qǐng)求的 URL 重寫為這個(gè)目標(biāo)。
標(biāo)志(可選):控制重寫的行為,常見的標(biāo)志有:
last
:表示重新搜索新的 location 塊(即繼續(xù)匹配新的規(guī)則)。break
:停止當(dāng)前 location 塊中的規(guī)則匹配,執(zhí)行后續(xù)指令。redirect
:執(zhí)行臨時(shí)重定向(302)。permanent
:執(zhí)行永久重定向(301)。
這里舉個(gè)例子:
rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last;
可以分解為:
^/archive/(\d{4})/(\d{2})/(\d{2})$
:這是一個(gè)正則表達(dá)式,表示匹配/archive/
后跟著年份、月份和日期的 URL。具體匹配:^
表示匹配 URL 的開始;/archive/
是固定的路徑部分;(\d{4})
匹配 4 位數(shù)字(年份);(\d{2})
匹配 2 位數(shù)字(月份);(\d{2})
匹配 2 位數(shù)字(日期);$
表示匹配 URL 的結(jié)尾。
/archive?year=$1&month=$2&day=$3
:這是重寫后的目標(biāo) URL。這里使用了捕獲組的替換:$1
被替換為第一個(gè)捕獲組(即年份)。$2
被替換為第二個(gè)捕獲組(即月份)。$3
被替換為第三個(gè)捕獲組(即日期)。- 最終重寫的 URL 是
/archive?year=2024&month=03&day=25
。
last
:這個(gè)標(biāo)志表示 Nginx 會(huì)停止當(dāng)前的rewrite
匹配,并繼續(xù)重新匹配請(qǐng)求的新 URL(即/archive?year=2024&month=03&day=25
)。
首先來看這部分正則表達(dá)式:
(\d{4})/(\d{2})/(\d{2})
。
(\d{4})
:
\d
是一個(gè)正則表達(dá)式元字符,表示匹配 數(shù)字字符,即 0-9 的任意數(shù)字。{4}
是量詞,表示前面的表達(dá)式(這里是\d
)必須出現(xiàn) 4 次。- 因此,
(\d{4})
匹配 4 位數(shù)字,通常用來表示年份(比如 2024)。/(\d{2})
:
- 同理,
(\d{2})
匹配 2 位數(shù)字,通常用來表示月份(如03
)或日期(如25
)。- 這里的
\d{2}
匹配的是 2 個(gè)數(shù)字,表示月份或日期。/(\d{2})
:
- 這個(gè)部分與上面相同,匹配的是 2 位數(shù)字,通常表示日期部分。
綜合起來:
(\d{4})/(\d{2})/(\d{2})
就是用來匹配像/2024/03/25
這樣的 URL,具體來說:
- 第一部分
(\d{4})
匹配年份部分(例如 2024)。- 第二部分
(\d{2})
匹配月份部分(例如 03)。- 第三部分
(\d{2})
匹配日期部分(例如 25)。
()
作用:括號(hào)
()
用來 捕獲匹配的內(nèi)容。捕獲的內(nèi)容可以通過$1
,$2
,$3
來引用。這是正則表達(dá)式中的“捕獲組”(capture groups)。在示例中,
(\d{4})
、(\d{2})
和(\d{2})
就是捕獲組,分別捕獲年份、月份和日期。
$1
、$2
、$3
是什么意思?在正則表達(dá)式中,捕獲組(即
()
中匹配的內(nèi)容)會(huì)按順序賦予數(shù)字標(biāo)識(shí)。
$1
:引用第一個(gè)捕獲組(這里是(\d{4})
),即年份部分。$2
:引用第二個(gè)捕獲組(這里是(\d{2})
),即月份部分。$3
:引用第三個(gè)捕獲組(這里是(\d{2})
),即日期部分。假設(shè)請(qǐng)求的 URL 是
/archive/2024/03/25
,在rewrite
指令中,(\d{4})
將捕獲到2024
,(\d{2})
捕獲到03
,另一個(gè)(\d{2})
捕獲到25
。
$1
就是2024
(第一個(gè)捕獲組)。$2
就是03
(第二個(gè)捕獲組)。$3
就是25
(第三個(gè)捕獲組)。
try_files 指令
try_files 用于檢查一系列文件是否存在,如果文件存在則繼續(xù)處理,否則進(jìn)行 URL 重寫。它常用于靜態(tài)資源的處理,例如檢查文件是否存在,如果不存在,則重寫請(qǐng)求到某個(gè)頁面(通常是首頁或錯(cuò)誤頁面)。
try_files <文件1> <文件2> ... <重寫目標(biāo)>;
常見的 URL 重寫場(chǎng)景
實(shí)現(xiàn) 301/302 重定向
當(dāng)你需要將舊 URL 重定向到新 URL 時(shí),rewrite
指令非常有用。301 是永久重定向,告訴搜索引擎這個(gè)頁面已經(jīng)被永久移動(dòng);302 是臨時(shí)重定向,表示頁面將暫時(shí)被移動(dòng)到新的 URL。
示例:將 http://example.com/old-page
重定向到 http://example.com/new-page
server { listen 80; server_name example.com; location /old-page { rewrite ^/old-page$ /new-page permanent; } location /new-page { # 處理新頁面的配置 } }
配置解釋:
rewrite ^/old-page$ /new-page permanent;
:將/old-page
重定向到/new-page
,并使用永久重定向(301)。permanent
標(biāo)志表示這是一個(gè)永久性重定向。
將非 www 域名重定向到 www 域名
如果你希望所有請(qǐng)求都通過 www.example.com
訪問,可以使用 Nginx 重定向非 www 域名的請(qǐng)求。
示例:將 example.com
重定向到 www.example.com
server { listen 80; server_name example.com; # 進(jìn)行 301 重定向 return 301 http://www.example.com$request_uri; } server { listen 80; server_name www.example.com; location / { # 正常的站點(diǎn)配置 } }
配置解釋:
return 301 http://www.example.com$request_uri;
:將所有example.com
的請(qǐng)求重定向到www.example.com
,并保留請(qǐng)求的 URI。
URL 正則重寫:簡(jiǎn)化 URL 結(jié)構(gòu)
你可以使用正則表達(dá)式對(duì) URL 進(jìn)行重寫,使 URL 更加簡(jiǎn)潔、符合 SEO 標(biāo)準(zhǔn)。
示例:將 /category/id/123
重寫為 /category/123
server { listen 80; server_name example.com; location /category/id/ { rewrite ^/category/id/(\d+)$ /category/$1 last; } }
配置解釋:
rewrite ^/category/id/(\d+)$ /category/$1 last;
:將/category/id/123
重寫為/category/123
,并使用last
標(biāo)志繼續(xù)匹配新的location
塊。
動(dòng)態(tài) URL 重寫:參數(shù)化查詢
如果你的網(wǎng)站 URL 需要支持動(dòng)態(tài)查詢參數(shù),可以使用 rewrite
指令根據(jù) URL 參數(shù)進(jìn)行重寫。
示例:將 /search?q=keyword
重寫為 /search/keyword
server { listen 80; server_name example.com; location /search { rewrite ^/search\?q=(\w+)$ /search/$1 last; } }
配置解釋:
rewrite ^/search\?q=(\w+)$ /search/$1 last;
:將/search?q=keyword
重寫為/search/keyword
,并使用last
標(biāo)志繼續(xù)匹配新的location
塊。
404 頁面重定向
當(dāng)請(qǐng)求的文件或頁面不存在時(shí),你可能希望將請(qǐng)求重定向到一個(gè)自定義的 404 頁面或者首頁??梢酝ㄟ^ try_files
指令實(shí)現(xiàn)。
示例:當(dāng)請(qǐng)求的文件不存在時(shí),重定向到 index.html
server { listen 80; server_name example.com; location / { try_files $uri $uri/ /index.html; } }
配置解釋:
try_files $uri $uri/ /index.html;
:Nginx 將首先檢查請(qǐng)求的文件是否存在,如果不存在,則將請(qǐng)求重寫為/index.html
。
結(jié)合正則表達(dá)式進(jìn)行動(dòng)態(tài) URL 重寫
Nginx 支持強(qiáng)大的正則表達(dá)式匹配功能,可以用來處理更復(fù)雜的 URL 重寫需求。以下是一個(gè)更復(fù)雜的 URL 重寫示例,結(jié)合條件和正則表達(dá)式來進(jìn)行動(dòng)態(tài)路由。
示例:根據(jù)日期重寫 URL
server { listen 80; server_name example.com; location /archive/ { rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last; } }
配置解釋:
- rewrite ^/archive/(\d{4})/(\d{2})/(\d{2})$ /archive?year=$1&month=$2&day=$3 last;:將 /archive/2024/03/25 重寫為 /archive?year=2024&month=03&day=25。
以上就是在Nginx中實(shí)現(xiàn)URL重寫與重定向的詳細(xì)內(nèi)容,更多關(guān)于Nginx URL重寫與重定向的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法(親測(cè))
- Nginx地址重定向的實(shí)現(xiàn)
- nginx的服務(wù)配置及重定向問題
- nginx重寫和重定向關(guān)系與配置方式
- nginx重定向解決(rewrite or internal redirection cycle)
- Nginx重定向后請(qǐng)求參數(shù)丟失的原因分析及解決方案
- nginx反向代理后無限重定向的問題解決方法
- Nginx中rewrite(地址重定向)的深入剖析
- 利用Nginx實(shí)現(xiàn)URL重定向的簡(jiǎn)單方法
- 配置nginx 重定向到系統(tǒng)維護(hù)頁面
- nginx中重定向的實(shí)現(xiàn)
相關(guān)文章
nginx+lua+redis 灰度發(fā)布實(shí)現(xiàn)方案
在微服務(wù)化進(jìn)程中,利用nginx+lua+redis實(shí)現(xiàn)灰度發(fā)布至關(guān)重要,,通過nginx+lua反向代理,根據(jù)客戶端ip進(jìn)行路由控制,配合redis存儲(chǔ)允許訪問微服務(wù)的ip地址,可以有效地進(jìn)行用戶分流,感興趣的可以了解一下2024-10-10nginx的配置轉(zhuǎn)發(fā)到其他網(wǎng)站詳解
這篇文章主要為大家介紹了nginx的配置轉(zhuǎn)發(fā)到其他網(wǎng)站過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08nginx worker進(jìn)程循環(huán)的實(shí)現(xiàn)
這篇文章主要介紹了nginx worker進(jìn)程循環(huán)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02使用nginx搭建點(diǎn)播和直播流媒體服務(wù)器的方法步驟
本篇文章主要介紹了使用nginx搭建點(diǎn)播和直播流媒體服務(wù)器的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03502?Bad?Gateway產(chǎn)生的原因及8個(gè)詳細(xì)的解決方法總結(jié)
Nginx?502?Bad?Gateway的錯(cuò)誤已經(jīng)遇到好幾次了,這里做一下記錄,備忘,下面這篇文章主要給大家介紹了關(guān)于502?Bad?Gateway產(chǎn)生的原因及8個(gè)詳細(xì)的解決方法,文中的介紹非常詳細(xì),需要的朋友可以參考下2023-05-05