運維工作中 Nginx Rewrite 既強大又易坑。本文整理 7 個高頻生產場景,提供可直接落地的配置片段與核心指令解析。
server {
listen 80;
server_name abc.com;
access_log off;
rewrite ^(.+)$ $scheme://www.$host$1 permanent;
}
$scheme 保持協議,$host 獲取請求主機名,permanent 返回 301。
server {
server_name www.abc.com www.def.com;
location / {
if ($host = 'www.abc.com') {
rewrite ^/(.*)$ https://www.def.com/$1 permanent;
}
}
}
建議在 server_name 同時列出新舊域名,避免額外 server 塊。
server {
set $rewrite true;
if ($remote_addr = "1.2.3.4") { set $rewrite false; }
if ($rewrite = true) {
rewrite ^(.+)$ https://www.abc.com/maintenance.html redirect;
}
location = /maintenance.html {
root /var/vhost;
}
}
if 或使用 geo 模塊location = 精確匹配,避免循環重寫redirect 返回 302 臨時跳轉,permanent 為 301server {
server_name bbs.abc.com;
location /post {
rewrite ^(.+)$ https://www.abc.com/bbs$1 permanent;
}
}
$1 捕獲完整 URI 路徑含查詢串,自動保持參數。
# 單頁面跳轉
if ($request_uri ~* ^/note\.php\?product_code=(.*)$) {
rewrite ^ https://www.abc.com permanent;
}
# 多論壇 ID 批量跳轉
if ($request_uri ~ ^/forum-(140|141|142|143|144|145|150|151|152|153|154|155|156|157|158|159|200|222|223|224|225|226|227|228)-(\d+)\.html$) {
rewrite ^ https://www.abc.com/list permanent;
}
~* 大小寫不敏感,$request_uri 包含查詢串,$uri 不含。
location ~* /upload/.*\.php$ {
return 404;
}
安全加固必備,防止上傳木馬執行。return 404 比 deny all 隱藏真實狀態。
location ~* ^/ab/maintain/main.html {
rewrite ^(.+)$ https://www.abc.com/maintain/main.html permanent;
}
| 指令 | 作用 | 旗標 |
|---|---|---|
| rewrite | URL 重寫 | last/break/redirect/permanent |
| return | 直接返回狀態碼/內容 | 404/302/200 "text" |
| if | 條件判斷 | 變量匹配/正則/文件存在 |
| set | 設置變量 | 邏輯組合控制 |
if 是惡魔:優先用 location 匹配,if 僅用於 return/rewrite ... last$1..$9 僅在當前 rewrite 生效?nginx -t、curl -v 觀察 Location 頭