在Nginx中實(shí)現(xiàn)URL重寫(xiě)與重定向
URL 重寫(xiě)(Rewrite)
Nginx 的 **URL 重寫(xiě)(Rewrite)**功能允許你根據(jù)請(qǐng)求的 URL 動(dòng)態(tài)地修改請(qǐng)求路徑或進(jìn)行重定向。通過(guò) URL 重寫(xiě),你可以實(shí)現(xiàn)諸如:
- 友好 URL:將復(fù)雜的 URL 轉(zhuǎn)換為簡(jiǎn)潔、易記的形式。
- 301/302 重定向:實(shí)現(xiàn)頁(yè)面永久或臨時(shí)重定向。
- 條件重寫(xiě):基于不同的條件(如請(qǐng)求頭、IP 地址、用戶代理等)修改請(qǐng)求路徑。
本文將詳細(xì)介紹如何在 Nginx 中實(shí)現(xiàn) URL 重寫(xiě),并給出一些常見(jiàn)的實(shí)際場(chǎng)景。
Nginx 中的 URL 重寫(xiě)指令
Nginx 中的 URL 重寫(xiě)主要依賴于兩個(gè)指令:
rewrite:用于修改請(qǐng)求的 URL。try_files:嘗試一系列的文件路徑,并在文件不存在時(shí)重寫(xiě) URL。
rewrite 指令
rewrite 指令允許你根據(jù)正則表達(dá)式重寫(xiě) URL。其基本語(yǔ)法如下:
rewrite <匹配規(guī)則> <重寫(xiě)目標(biāo)> [標(biāo)志];
匹配規(guī)則:正則表達(dá)式,匹配請(qǐng)求的 URL。
重寫(xiě)目標(biāo):新的 URL,符合規(guī)則時(shí),Nginx 會(huì)將請(qǐng)求的 URL 重寫(xiě)為這個(gè)目標(biāo)。
標(biāo)志(可選):控制重寫(xiě)的行為,常見(jiàn)的標(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 的開(kāi)始;/archive/是固定的路徑部分;(\d{4})匹配 4 位數(shù)字(年份);(\d{2})匹配 2 位數(shù)字(月份);(\d{2})匹配 2 位數(shù)字(日期);$表示匹配 URL 的結(jié)尾。
/archive?year=$1&month=$2&day=$3:這是重寫(xiě)后的目標(biāo) URL。這里使用了捕獲組的替換:$1被替換為第一個(gè)捕獲組(即年份)。$2被替換為第二個(gè)捕獲組(即月份)。$3被替換為第三個(gè)捕獲組(即日期)。- 最終重寫(xiě)的 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)。
首先來(lái)看這部分正則表達(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ù)字,通常用來(lái)表示年份(比如 2024)。/(\d{2}):
- 同理,
(\d{2})匹配 2 位數(shù)字,通常用來(lái)表示月份(如03)或日期(如25)。- 這里的
\d{2}匹配的是 2 個(gè)數(shù)字,表示月份或日期。/(\d{2}):
- 這個(gè)部分與上面相同,匹配的是 2 位數(shù)字,通常表示日期部分。
綜合起來(lái):
(\d{4})/(\d{2})/(\d{2})就是用來(lái)匹配像/2024/03/25這樣的 URL,具體來(lái)說(shuō):
- 第一部分
(\d{4})匹配年份部分(例如 2024)。- 第二部分
(\d{2})匹配月份部分(例如 03)。- 第三部分
(\d{2})匹配日期部分(例如 25)。
()作用:括號(hào)
()用來(lái) 捕獲匹配的內(nèi)容。捕獲的內(nèi)容可以通過(guò)$1,$2,$3來(lái)引用。這是正則表達(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 重寫(xiě)。它常用于靜態(tài)資源的處理,例如檢查文件是否存在,如果不存在,則重寫(xiě)請(qǐng)求到某個(gè)頁(yè)面(通常是首頁(yè)或錯(cuò)誤頁(yè)面)。
try_files <文件1> <文件2> ... <重寫(xiě)目標(biāo)>;
常見(jiàn)的 URL 重寫(xiě)場(chǎng)景
實(shí)現(xiàn) 301/302 重定向
當(dāng)你需要將舊 URL 重定向到新 URL 時(shí),rewrite 指令非常有用。301 是永久重定向,告訴搜索引擎這個(gè)頁(yè)面已經(jīng)被永久移動(dòng);302 是臨時(shí)重定向,表示頁(yè)面將暫時(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 {
# 處理新頁(yè)面的配置
}
}
配置解釋:
rewrite ^/old-page$ /new-page permanent;:將/old-page重定向到/new-page,并使用永久重定向(301)。permanent標(biāo)志表示這是一個(gè)永久性重定向。
將非 www 域名重定向到 www 域名
如果你希望所有請(qǐng)求都通過(guò) www.example.com 訪問(wèn),可以使用 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 正則重寫(xiě):簡(jiǎn)化 URL 結(jié)構(gòu)
你可以使用正則表達(dá)式對(duì) URL 進(jìn)行重寫(xiě),使 URL 更加簡(jiǎn)潔、符合 SEO 標(biāo)準(zhǔn)。
示例:將 /category/id/123 重寫(xiě)為 /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重寫(xiě)為/category/123,并使用last標(biāo)志繼續(xù)匹配新的location塊。
動(dòng)態(tài) URL 重寫(xiě):參數(shù)化查詢
如果你的網(wǎng)站 URL 需要支持動(dòng)態(tài)查詢參數(shù),可以使用 rewrite 指令根據(jù) URL 參數(shù)進(jìn)行重寫(xiě)。
示例:將 /search?q=keyword 重寫(xiě)為 /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重寫(xiě)為/search/keyword,并使用last標(biāo)志繼續(xù)匹配新的location塊。
404 頁(yè)面重定向
當(dāng)請(qǐng)求的文件或頁(yè)面不存在時(shí),你可能希望將請(qǐng)求重定向到一個(gè)自定義的 404 頁(yè)面或者首頁(yè)。可以通過(guò) 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)求重寫(xiě)為/index.html。
結(jié)合正則表達(dá)式進(jìn)行動(dòng)態(tài) URL 重寫(xiě)
Nginx 支持強(qiáng)大的正則表達(dá)式匹配功能,可以用來(lái)處理更復(fù)雜的 URL 重寫(xiě)需求。以下是一個(gè)更復(fù)雜的 URL 重寫(xiě)示例,結(jié)合條件和正則表達(dá)式來(lái)進(jìn)行動(dòng)態(tài)路由。
示例:根據(jù)日期重寫(xiě) 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 重寫(xiě)為 /archive?year=2024&month=03&day=25。
以上就是在Nginx中實(shí)現(xiàn)URL重寫(xiě)與重定向的詳細(xì)內(nèi)容,更多關(guān)于Nginx URL重寫(xiě)與重定向的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法(親測(cè))
- Nginx地址重定向的實(shí)現(xiàn)
- nginx的服務(wù)配置及重定向問(wèn)題
- nginx重寫(xiě)和重定向關(guān)系與配置方式
- nginx重定向解決(rewrite or internal redirection cycle)
- Nginx重定向后請(qǐng)求參數(shù)丟失的原因分析及解決方案
- nginx反向代理后無(wú)限重定向的問(wèn)題解決方法
- Nginx中rewrite(地址重定向)的深入剖析
- 利用Nginx實(shí)現(xiàn)URL重定向的簡(jiǎn)單方法
- 配置nginx 重定向到系統(tǒng)維護(hù)頁(yè)面
- nginx中重定向的實(shí)現(xiàn)
相關(guān)文章
Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持
這篇文章主要介紹了Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持,使用Nginx運(yùn)行ThinkPHP的必備配置,需要的朋友可以參考下2015-07-07
nginx中端口無(wú)權(quán)限的問(wèn)題解決
當(dāng) Nginx 日志報(bào)錯(cuò)?bind() to 80 failed (13: Permission denied)?時(shí),這通常是由于權(quán)限不足導(dǎo)致 Nginx 無(wú)法綁定到 80 端口,下面就來(lái)介紹一下該問(wèn)題的解決,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07
部署Nginx+Apache動(dòng)靜分離的實(shí)例詳解
Nginx不僅能作為Web服務(wù)器,還具有反向代理、負(fù)載均衡和緩存的功能,這篇文章主要介紹了部署Nginx+Apache動(dòng)靜分離的實(shí)例代碼,需要的朋友可以參考下2019-12-12
nginx?rewrite?用法如何使用rewrite去除URL中的特定參數(shù)
日常服務(wù)中經(jīng)常會(huì)用Nginx做一層代理轉(zhuǎn)發(fā),把Nginx當(dāng)做前置機(jī),這篇文章主要介紹了nginx?rewrite?用法如何使用rewrite去除URL中的特定參數(shù),需要的朋友可以參考下2024-02-02
Nginx更新SSL證書(shū)的實(shí)現(xiàn)步驟
本文主要介紹了Nginx更新SSL證書(shū)的實(shí)現(xiàn)步驟,包括下載新證書(shū)、備份舊證書(shū)、配置新證書(shū)、驗(yàn)證配置及遇到問(wèn)題時(shí)的解決方法,感興趣的了解一下2025-12-12
nginx的80端口無(wú)法被遠(yuǎn)程服務(wù)器訪問(wèn)的問(wèn)題解決
這篇文章主要介紹了nginx的80端口無(wú)法被遠(yuǎn)程服務(wù)器訪問(wèn)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Nginx下Wordpress的永久鏈接實(shí)現(xiàn)(301,404等)
經(jīng)過(guò)多番測(cè)試,終于在nginx下實(shí)現(xiàn)了rewrite的功能,WrodPress的永久鏈接終于生效了2012-09-09

