Nginx 重寫與重定向配置方法
區(qū)分重寫與重定向
重寫: 請求路徑被修改,但客戶端感知不到變化。通常發(fā)生在服務(wù)器端,屬于內(nèi)部操作2。
重定向: 將客戶端引導(dǎo)至另一個 URL 地址,瀏覽器會收到新的地址提示并再次發(fā)送請求2。
一.try_files指令
try_files $uri $uri/ /admin/index.html;
用途
try_files 指令用于按順序檢查指定文件或目錄是否存在,如果存在則提供服務(wù),如果都不存在則執(zhí)行最后的回退操作(通常是重定向或返回某個文件)。它是 Nginx 中處理靜態(tài)文件或單頁應(yīng)用(SPA)常用的指令。
參數(shù)解釋
$uri:表示客戶端請求的 URI 路徑(不包括域名和查詢字符串)。例如,請求 http://example.com/admin/test,$uri 是 /admin/test。
$uri/:表示請求的 URI 路徑加上斜杠,檢查它是否為一個目錄。例如,如果 $uri 是 /admin/test,則 $uri/ 是 /admin/test/。
/admin/index.html:回退路徑,如果前面的文件或目錄都不存在,Nginx 會嘗試提供這個路徑(相對于 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", 本地時間:[$time_local], 請求體內(nèi)容:"$request_body" 響應(yīng)體字節(jié)數(shù):$body_bytes_sent, ' '遠程用戶:$remote_user, 代理轉(zhuǎn)發(fā)IP:"$http_x_forwarded_for"\n';
工作原理
Nginx 按順序檢查以下內(nèi)容:
首先檢查 $uri 是否對應(yīng)一個文件(例如 /usr/nginx/demo/im-admin/test)。
如果文件不存在,檢查 $uri/ 是否對應(yīng)一個目錄(例如 /usr/nginx/demo/im-admin/test/)。
如果目錄也不存在,Nginx 將請求內(nèi)部重定向到最后的回退路徑 /admin/index.html。
如果回退路徑 /admin/index.html 也無法處理(例如文件不存在),Nginx 返回 404 錯誤(除非有其他配置覆蓋)。
二.return指令
return 301 /admin/index;
用途
return 指令用于立即終止當前請求的處理,并向客戶端返回指定的 HTTP 狀態(tài)碼和響應(yīng)(通常是重定向)。301 表示永久重定向,告訴客戶端(瀏覽器或爬蟲)目標 URL 已永久更改,未來應(yīng)直接訪問新 URL。
參數(shù)解釋
301:HTTP 狀態(tài)碼,表示永久重定向。客戶端會緩存這個重定向,之后的請求會直接訪問新 URL。
/admin/index:目標 URL 路徑(相對于域名)。Nginx 會將客戶端重定向到這個路徑。
分號 (;): 表示指令結(jié)束。
工作原理
當 Nginx 匹配到包含 return 301 /admin/index; 的 location 塊時,立即停止處理當前請求。
Nginx 向客戶端返回 HTTP 301 響應(yīng),包含 Location: /admin/index 頭。
客戶端(瀏覽器)收到 301 響應(yīng)后,自動發(fā)起對 http://example.com/admin/index 的新請求。
因為是永久重定向,瀏覽器通常會緩存這個重定向規(guī)則,后續(xù)直接訪問 /admin/index。
兩者的區(qū)別與結(jié)合使用
特性 | try_files | return 301 |
功能 | 檢查文件/目錄是否存在,決定如何處理請求 | 立即重定向到新 URL |
影響 | 內(nèi)部重定向(客戶端無感知) | 外部重定向(客戶端收到新 URL) |
典型場景 | 靜態(tài)文件服務(wù)、SPA 路由回退 | URL 規(guī)范化、路徑重定向 |
客戶端體驗 | 無額外請求,URL 不變 | 觸發(fā)新請求,URL 變化 |
性能 | 單次請求處理 | 兩次請求(重定向 + 新請求) |
示例
# 301 永久重定向 return 301 https://example.com$request_uri; # 302 臨時重定向 return 302 /new-path; # 403 禁止訪問 return 403 "Access Forbidden";
三.rewrite指令
在 Nginx 中,rewrite 指令用于重寫或修改請求的 URI。它是 Nginx 的核心功能之一,常用于 URL 重定向、規(guī)范化 URL、實現(xiàn)偽靜態(tài)頁面或隱藏真實路徑等場景。rewrite 指令通常在 http、server 或 location 上下文中使用,屬于 ngx_http_rewrite_module 模塊。
基本語法
rewrite regex replacement [flag];
regex: 正則表達式,用于匹配請求的 URI。
replacement: 替換后的 URI 或目標字符串,可以包含捕獲組($1, $2 等)。
flag: 可選的標志,用于控制重寫行為,支持以下值:
last: 停止處理當前階段的 rewrite 指令,重新匹配新的 URI。
break: 停止處理當前階段的 rewrite 指令,不重新匹配。
redirect: 返回 302 臨時重定向。
permanent: 返回 301 永久重定向。
工作原理
Nginx 接收到客戶端的請求后,檢查 rewrite 指令的正則表達式是否匹配當前 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 時,Nginx 將 URI 改為 /new-path,并重新匹配 location。
2. 正則表達式與捕獲組
將 /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 會返回 301 重定向到 /articles/post1。
4. 條件重寫
結(jié)合 if 指令,根據(jù)條件重寫:
if ($http_user_agent ~* "mobile") { rewrite ^(.*)$ /mobile/$1 last; }
如果用戶代理包含 "mobile",將請求重寫到 /mobile/ 路徑。
注意事項
性能:過多的 rewrite 規(guī)則或復(fù)雜的正則表達式可能影響性能,盡量精簡。
優(yōu)先級:rewrite 指令按順序執(zhí)行,注意規(guī)則的排列順序。
last vs break:
last 會重新查找匹配的 location,適合需要跳轉(zhuǎn)到其他 location 的場景。
break 僅停止當前 rewrite 處理,適合在同一 location 內(nèi)繼續(xù)處理。
調(diào)試:使用 rewrite_log on; 開啟重寫日志,便于排查問題。
避免循環(huán):不當?shù)?rewrite 規(guī)則可能導(dǎo)致重定向循環(huán),需仔細測試。
常見用途
URL 美化:將動態(tài) URL 轉(zhuǎn)換為偽靜態(tài)(如 /article.php?id=123 改為 /article/123)。
重定向:遷移網(wǎng)站或更改域名時,引導(dǎo)舊 URL 到新 URL。
規(guī)范化:統(tǒng)一 URL 格式(如強制 HTTPS 或去除 www)。
防盜鏈或隱藏路徑:通過重寫隱藏真實文件路徑。
示例配置
以下是一個綜合示例:
server { listen 80; server_name example.com; # 強制 HTTPS rewrite ^(.*)$ https://$host$1 permanent; location / { # 將 /news/123 改為 /news.php?id=123 rewrite ^/news/(\d+)$ /news.php?id=$1 last; # 將 /old-page 臨時重定向到 /new-page rewrite ^/old-page$ /new-page redirect; } }
常見場景配置
強制 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 擴展名) rewrite ^/([^.?]+)$ /$1.php last;
處理 404 錯誤
error_page 404 /404.html; location = /404.html { internal; }
Nginx 中 rewrite 和 proxy_pass 的不同應(yīng)用場景
1. 功能定義
rewrite: 主要用于在同一域名下修改請求路徑,從而改變資源的實際訪問位置。它可以利用正則表達式對 URL 進行動態(tài)處理,并支持多種標志位來決定后續(xù)的行為。
proxy_pass: 用于將請求轉(zhuǎn)發(fā)給后端服務(wù)器,實現(xiàn)反向代理的功能。它能夠隱藏真實的后端服務(wù)地址,提供負載均衡、緩存等功能。
2. 工作機制對比
rewrite:
對于客戶端而言,整個過程是透明的,即瀏覽器地址欄不會發(fā)生任何變化。
常見用途包括調(diào)整路徑結(jié)構(gòu)、刪除或添加某些參數(shù)等。
示例:當需要將 /old-path/resource 轉(zhuǎn)變?yōu)?/new-path/resource 時,可以通過 rewrite 實現(xiàn)內(nèi)部映射。
proxy_pass:
把來自用戶的請求傳遞到另一臺或多臺服務(wù)器上執(zhí)行實際的任務(wù)。
若配合變量使用,則可靈活指定目標主機及其端口。
比如,在微服務(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)文章
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置方法, 需要的朋友可以參考下。2010-06-06Nginx常用配置以及代理轉(zhuǎn)發(fā)操作詳解
這篇文章主要給大家介紹了關(guān)于Nginx常用配置以及代理轉(zhuǎn)發(fā)的相關(guān)資料,nginx一般被用來做反向代理,將請求轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器上,比如tomcat的應(yīng)用,需要的朋友可以參考下2023-09-09centos 7.0 使用Nginx部署flask應(yīng)用教程
這篇文章主要介紹了centos 7.0 使用Nginx部署flask應(yīng)用教程,需要的朋友可以參考下2017-12-12Nginx 獲取客戶端真實IP $remote_addr與X-Forwarded-For的實現(xiàn)
我們大多數(shù)情況下訪問服務(wù)時,客戶端并不是直接訪問到服務(wù)器的,本文主要介紹了Nginx 獲取客戶端真實IP $remote_addr與X-Forwarded-For的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-03-03高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解
今天小編就為大家分享一篇關(guān)于高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Nginx部署React項目時重定向循環(huán)問題的解決方案
Nginx在處理React項目請求時出現(xiàn)重定向循環(huán),通常是由于`try_files`配置錯誤或`root`路徑配置不當導(dǎo)致的,本文給大家詳細介紹了相關(guān)的解決方法,需要的朋友可以參考下2025-05-05