Nginx 重寫與重定向配置方法
區(qū)分重寫與重定向
重寫: 請求路徑被修改,但客戶端感知不到變化。通常發(fā)生在服務(wù)器端,屬于內(nèi)部操作2。
重定向: 將客戶端引導(dǎo)至另一個(gè) URL 地址,瀏覽器會(huì)收到新的地址提示并再次發(fā)送請求2。
一.try_files指令
try_files $uri $uri/ /admin/index.html;
用途
try_files 指令用于按順序檢查指定文件或目錄是否存在,如果存在則提供服務(wù),如果都不存在則執(zhí)行最后的回退操作(通常是重定向或返回某個(gè)文件)。它是 Nginx 中處理靜態(tài)文件或單頁應(yīng)用(SPA)常用的指令。
參數(shù)解釋
$uri:表示客戶端請求的 URI 路徑(不包括域名和查詢字符串)。例如,請求 http://example.com/admin/test,$uri 是 /admin/test。
$uri/:表示請求的 URI 路徑加上斜杠,檢查它是否為一個(gè)目錄。例如,如果 $uri 是 /admin/test,則 $uri/ 是 /admin/test/。
/admin/index.html:回退路徑,如果前面的文件或目錄都不存在,Nginx 會(huì)嘗試提供這個(gè)路徑(相對于 alias 或 root 定義的目錄)。
分號 (;): 表示指令結(jié)束。
示例
# 處理 /admin/ 路徑
location /admin/ {
alias /usr/nginx/demo/im-admin/;
index index.html;
try_files $uri $uri/ /admin/index.html; # 回退到 index.html
}
# 處理 /admin/imadmin/ 和 /admin/imadmin(無斜杠)
location ~ ^/admin/imadmin/?$ {
access_log /var/log/nginx/imadmin.log;
return 301 /admin/index; # 永久重定向到 /admin/index
}日志格式優(yōu)化
log_format main '響應(yīng)狀態(tài)碼:$status, 來源頁面:"$http_referer", 客戶端IP地址:$remote_addr, 請求詳情:"$request", '
'用戶代理:"$http_user_agent", 本地時(shí)間:[$time_local], 請求體內(nèi)容:"$request_body" 響應(yīng)體字節(jié)數(shù):$body_bytes_sent, '
'遠(yuǎn)程用戶:$remote_user, 代理轉(zhuǎn)發(fā)IP:"$http_x_forwarded_for"\n';工作原理
Nginx 按順序檢查以下內(nèi)容:
首先檢查 $uri 是否對應(yīng)一個(gè)文件(例如 /usr/nginx/demo/im-admin/test)。
如果文件不存在,檢查 $uri/ 是否對應(yīng)一個(gè)目錄(例如 /usr/nginx/demo/im-admin/test/)。
如果目錄也不存在,Nginx 將請求內(nèi)部重定向到最后的回退路徑 /admin/index.html。
如果回退路徑 /admin/index.html 也無法處理(例如文件不存在),Nginx 返回 404 錯(cuò)誤(除非有其他配置覆蓋)。
二.return指令
return 301 /admin/index;
用途
return 指令用于立即終止當(dāng)前請求的處理,并向客戶端返回指定的 HTTP 狀態(tài)碼和響應(yīng)(通常是重定向)。301 表示永久重定向,告訴客戶端(瀏覽器或爬蟲)目標(biāo) URL 已永久更改,未來應(yīng)直接訪問新 URL。
參數(shù)解釋
301:HTTP 狀態(tài)碼,表示永久重定向??蛻舳藭?huì)緩存這個(gè)重定向,之后的請求會(huì)直接訪問新 URL。
/admin/index:目標(biāo) URL 路徑(相對于域名)。Nginx 會(huì)將客戶端重定向到這個(gè)路徑。
分號 (;): 表示指令結(jié)束。
工作原理
當(dāng) Nginx 匹配到包含 return 301 /admin/index; 的 location 塊時(shí),立即停止處理當(dāng)前請求。
Nginx 向客戶端返回 HTTP 301 響應(yīng),包含 Location: /admin/index 頭。
客戶端(瀏覽器)收到 301 響應(yīng)后,自動(dòng)發(fā)起對 http://example.com/admin/index 的新請求。
因?yàn)槭怯谰弥囟ㄏ?,瀏覽器通常會(huì)緩存這個(gè)重定向規(guī)則,后續(xù)直接訪問 /admin/index。
兩者的區(qū)別與結(jié)合使用
特性 | try_files | return 301 |
功能 | 檢查文件/目錄是否存在,決定如何處理請求 | 立即重定向到新 URL |
影響 | 內(nèi)部重定向(客戶端無感知) | 外部重定向(客戶端收到新 URL) |
典型場景 | 靜態(tài)文件服務(wù)、SPA 路由回退 | URL 規(guī)范化、路徑重定向 |
客戶端體驗(yàn) | 無額外請求,URL 不變 | 觸發(fā)新請求,URL 變化 |
性能 | 單次請求處理 | 兩次請求(重定向 + 新請求) |
示例
# 301 永久重定向 return 301 https://example.com$request_uri; # 302 臨時(shí)重定向 return 302 /new-path; # 403 禁止訪問 return 403 "Access Forbidden";
三.rewrite指令

在 Nginx 中,rewrite 指令用于重寫或修改請求的 URI。它是 Nginx 的核心功能之一,常用于 URL 重定向、規(guī)范化 URL、實(shí)現(xiàn)偽靜態(tài)頁面或隱藏真實(shí)路徑等場景。rewrite 指令通常在 http、server 或 location 上下文中使用,屬于 ngx_http_rewrite_module 模塊。
基本語法
rewrite regex replacement [flag];
regex: 正則表達(dá)式,用于匹配請求的 URI。
replacement: 替換后的 URI 或目標(biāo)字符串,可以包含捕獲組($1, $2 等)。
flag: 可選的標(biāo)志,用于控制重寫行為,支持以下值:
last: 停止處理當(dāng)前階段的 rewrite 指令,重新匹配新的 URI。
break: 停止處理當(dāng)前階段的 rewrite 指令,不重新匹配。
redirect: 返回 302 臨時(shí)重定向。
permanent: 返回 301 永久重定向。
工作原理
Nginx 接收到客戶端的請求后,檢查 rewrite 指令的正則表達(dá)式是否匹配當(dāng)前 URI。
如果匹配,則將 URI 替換為 replacement 中指定的內(nèi)容。
根據(jù) flag 的設(shè)置,決定是繼續(xù)處理、停止處理還是發(fā)送重定向響應(yīng)。
示例
1. 基本重寫
將 /old-path 重寫為 /new-path:
location /old-path {
rewrite ^/old-path$ /new-path last;
}請求 /old-path 時(shí),Nginx 將 URI 改為 /new-path,并重新匹配 location。
2. 正則表達(dá)式與捕獲組
將 /user/123 重寫為 /profile.php?id=123:
常規(guī) /user/123 重復(fù) /profile.php?id=123:
location /user {
rewrite ^/user/(\d+)$ /profile.php?id=$1 last;
}(\d+) 捕獲數(shù)字部分,$1 表示捕獲的數(shù)字(如 123)。
3. 永久重定向
將所有 /blog/* 請求永久重定向到 /articles/*:
rewrite ^/blog/(.*)$ /articles/$1 permanent;
訪問 /blog/post1 會(huì)返回 301 重定向到 /articles/post1。
4. 條件重寫
結(jié)合 if 指令,根據(jù)條件重寫:
if ($http_user_agent ~* "mobile") {
rewrite ^(.*)$ /mobile/$1 last;
}如果用戶代理包含 "mobile",將請求重寫到 /mobile/ 路徑。
注意事項(xiàng)
性能:過多的 rewrite 規(guī)則或復(fù)雜的正則表達(dá)式可能影響性能,盡量精簡。
優(yōu)先級:rewrite 指令按順序執(zhí)行,注意規(guī)則的排列順序。
last vs break:
last 會(huì)重新查找匹配的 location,適合需要跳轉(zhuǎn)到其他 location 的場景。
break 僅停止當(dāng)前 rewrite 處理,適合在同一 location 內(nèi)繼續(xù)處理。
調(diào)試:使用 rewrite_log on; 開啟重寫日志,便于排查問題。
避免循環(huán):不當(dāng)?shù)?rewrite 規(guī)則可能導(dǎo)致重定向循環(huán),需仔細(xì)測試。
常見用途
URL 美化:將動(dòng)態(tài) URL 轉(zhuǎn)換為偽靜態(tài)(如 /article.php?id=123 改為 /article/123)。
重定向:遷移網(wǎng)站或更改域名時(shí),引導(dǎo)舊 URL 到新 URL。
規(guī)范化:統(tǒng)一 URL 格式(如強(qiáng)制 HTTPS 或去除 www)。
防盜鏈或隱藏路徑:通過重寫隱藏真實(shí)文件路徑。
示例配置
以下是一個(gè)綜合示例:
server {
listen 80;
server_name example.com;
# 強(qiáng)制 HTTPS
rewrite ^(.*)$ https://$host$1 permanent;
location / {
# 將 /news/123 改為 /news.php?id=123
rewrite ^/news/(\d+)$ /news.php?id=$1 last;
# 將 /old-page 臨時(shí)重定向到 /new-page
rewrite ^/old-page$ /new-page redirect;
}
}常見場景配置
強(qiáng)制 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}非 www 跳轉(zhuǎn)到 www
server {
listen 80;
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}反之,www 跳轉(zhuǎn)到非 www
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}舊域名跳轉(zhuǎn)到新域名
server {
listen 80;
server_name old.com;
return 301 $scheme://new.com$request_uri;
}移除 index.php
rewrite ^/(.*)/index\.php$ /$1 permanent; 美化 URL(隱藏 .php 擴(kuò)展名) rewrite ^/([^.?]+)$ /$1.php last;
處理 404 錯(cuò)誤
error_page 404 /404.html;
location = /404.html {
internal;
}Nginx 中 rewrite 和 proxy_pass 的不同應(yīng)用場景

1. 功能定義
rewrite: 主要用于在同一域名下修改請求路徑,從而改變資源的實(shí)際訪問位置。它可以利用正則表達(dá)式對 URL 進(jìn)行動(dòng)態(tài)處理,并支持多種標(biāo)志位來決定后續(xù)的行為。
proxy_pass: 用于將請求轉(zhuǎn)發(fā)給后端服務(wù)器,實(shí)現(xiàn)反向代理的功能。它能夠隱藏真實(shí)的后端服務(wù)地址,提供負(fù)載均衡、緩存等功能。
2. 工作機(jī)制對比
rewrite:
對于客戶端而言,整個(gè)過程是透明的,即瀏覽器地址欄不會(huì)發(fā)生任何變化。
常見用途包括調(diào)整路徑結(jié)構(gòu)、刪除或添加某些參數(shù)等。
示例:當(dāng)需要將 /old-path/resource 轉(zhuǎn)變?yōu)?/new-path/resource 時(shí),可以通過 rewrite 實(shí)現(xiàn)內(nèi)部映射。
proxy_pass:
把來自用戶的請求傳遞到另一臺(tái)或多臺(tái)服務(wù)器上執(zhí)行實(shí)際的任務(wù)。
若配合變量使用,則可靈活指定目標(biāo)主機(jī)及其端口。
比如,在微服務(wù)架構(gòu)里經(jīng)??吹筋愃七@樣的配置——前端統(tǒng)一入口接收所有類型的調(diào)用后再分配至相應(yīng)的業(yè)務(wù)模塊上去完成具體的操作。
到此這篇關(guān)于Nginx 重寫與重定向配置的文章就介紹到這了,更多相關(guān)Nginx 重寫與重定向配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文教會(huì)你使用Nginx訪問日志統(tǒng)計(jì)PV與UV
做網(wǎng)站的都知道,平常經(jīng)常要查詢下網(wǎng)站PV、UV等網(wǎng)站的訪問數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于如何使用Nginx訪問日志統(tǒng)計(jì)PV與UV的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置方法, 需要的朋友可以參考下。2010-06-06
Nginx常用配置以及代理轉(zhuǎn)發(fā)操作詳解
這篇文章主要給大家介紹了關(guān)于Nginx常用配置以及代理轉(zhuǎn)發(fā)的相關(guān)資料,nginx一般被用來做反向代理,將請求轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器上,比如tomcat的應(yīng)用,需要的朋友可以參考下2023-09-09
centos 7.0 使用Nginx部署flask應(yīng)用教程
這篇文章主要介紹了centos 7.0 使用Nginx部署flask應(yīng)用教程,需要的朋友可以參考下2017-12-12
Nginx 流量控制/限流的具體實(shí)現(xiàn)示例
限流是一種流量控制手段,用于限制單位時(shí)間內(nèi)可以通過系統(tǒng)的請求數(shù)或連接數(shù),本文主要介紹了Nginx流量控制/限流的具體實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Nginx 獲取客戶端真實(shí)IP $remote_addr與X-Forwarded-For的實(shí)現(xiàn)
我們大多數(shù)情況下訪問服務(wù)時(shí),客戶端并不是直接訪問到服務(wù)器的,本文主要介紹了Nginx 獲取客戶端真實(shí)IP $remote_addr與X-Forwarded-For的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
Centos 6.5 64位中Nginx詳細(xì)安裝部署教程
Nginx是一個(gè)web服務(wù)器也可以用來做負(fù)載均衡及反向代理使用,目前使用最多的就是負(fù)載均衡,具體簡介我就不介紹了百度一下有很多,下面直接進(jìn)入安裝步驟,需要的朋友可以參考下2017-08-08
高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解
今天小編就為大家分享一篇關(guān)于高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Nginx部署React項(xiàng)目時(shí)重定向循環(huán)問題的解決方案
Nginx在處理React項(xiàng)目請求時(shí)出現(xiàn)重定向循環(huán),通常是由于`try_files`配置錯(cuò)誤或`root`路徑配置不當(dāng)導(dǎo)致的,本文給大家詳細(xì)介紹了相關(guān)的解決方法,需要的朋友可以參考下2025-05-05

