Nginx 复杂 URL 跳转需 rewrite 指令协同位置、flag 和正则三要素:优先用 location 块,慎用 if;正则须加 ^$ 边界、正确转义与捕获;last 重匹配、break 终止匹配、permanent/redirect 触发浏览器跳转。

Nginx 实现符合正则的复杂 URL 跳转,核心靠 rewrite 指令配合 PCRE 正则表达式,但必须注意位置、flag 和正则写法三者协同——任一出错就容易 500、循环跳转或静默失效。
把 rewrite 放在对的地方
location 块是最安全、最常用的位置;server 块适合全局规则(如强制 HTTPS);尽量避免在 if 块里写 rewrite。
- location 内 rewrite 只作用于匹配该路径的请求,可控性强
- server 内 rewrite 对所有进来的请求生效,适合统一入口处理
- if 块中 rewrite 官方不推荐:if 是配置解析期判断,rewrite 是运行时执行,语义错位易引发偶发异常
正则写法要严谨,捕获和边界不能漏
- 开头用
^、结尾用$明确边界,避免部分匹配误触发 - 用
()捕获需要复用的片段,通过$1、$2引用 - 特殊字符如
.、?、/必须转义(写成\.、\?、\/) - 常见错误:
rewrite /old(.*) /new$1;缺少^和$,可能把/old-page错匹配成/old-page/xxx
选对 flag 才能达成预期效果
-
last:重写后新 URI 重新走 location 匹配流程 → 适合跨路径改写(如/api/v1/→/v2/),但要确保目标 location 存在,否则 404 -
break:重写后不再重新匹配,直接在当前 location 内继续处理 → 适合内部路径调整(如静态资源目录映射) -
redirect或permanent:只在 replacement 以http://、https://或$scheme://开头时才触发浏览器跳转- 正确:
rewrite ^/login$ $scheme://$host/auth permanent; - 错误:
rewrite ^/login$ /auth permanent;→ 实际等同于last,地址栏不变
- 正确:
复杂跳转常见组合写法
- 域名 + 路径 + 参数联合跳转:
location ~ ^/product/(\d+)/?$ { rewrite ^/product/(\d+)/?$ https://shop.example.com/item?id=$1 permanent; } - 多条件判断(配合 if + return 更稳妥):
if ($host ~* "^www\.old\.com$") { return 301 https://new.com$request_uri; } - 根据客户端 IP 或参数做差异化跳转:
if ($args ~* "debug=true") { rewrite ^(.*)$ $1?debug=1 break; }
不复杂但容易忽略细节。


















