nginx rewrite指令在server块中通过正则匹配uri并替换,flag决定行为:last重启location匹配,break终止重写,redirect返回302,permanent返回301;需注意精确匹配、参数保留与调试策略。

Nginx 的 rewrite 指令在 server 块中使用,可实现 URL 的内部重写或外部跳转,关键在于末尾的标志(flag)控制行为。
rewrite 语法与基本用法
rewrite 指令格式为:rewrite regex replacement [flag];
其中:
- regex 是 PCRE 兼容的正则表达式,匹配请求的 URI(不含域名和参数);
- replacement 是替换目标,可含捕获组(如 $1、$2);
- flag 决定后续处理逻辑,常用有:
-
last:停止当前 location 中的 rewrite,重新匹配新的 location(内部重写); -
break:停止所有 rewrite,不重新匹配(内部重写,但仅限当前 location); -
redirect:返回 302 临时跳转(明文 URL); -
permanent:返回 301 永久跳转(明文 URL)。
在 server 块中做跳转的典型场景
例如将旧路径 /old-page 永久跳转到新地址 /new-page:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"><code>rewrite ^/old-page$ /new-page permanent;</code>}
注意:
- 正则开头用 ^、结尾用 $ 确保精确匹配,避免误伤其他路径;
- 若需携带原查询参数(如 ?id=123),replacement 中加 ? 可自动追加(Nginx 默认保留);
- 若明确不想带参数,replacement 末尾加 ?(如 /new-page?)可丢弃。
带参数和路径捕获的 rewrite 示例
将 /article/123 跳转为 /post?id=123(302):
rewrite ^/article/(\d+)$ /post?id=$1 redirect;
若要 301 跳转,把 redirect 换成 permanent 即可。
多个 rewrite 按顺序执行,遇到匹配且带 last 或 break 的会中断后续;带 redirect/permanent 则直接返回响应,不再执行后续 rewrite。
常见坑与注意事项
不要在 server 块中滥用 last —— 它会触发新一轮 location 匹配,可能引发循环或意料外的行为。
- 若 rewrite 在 server 块中,且 replacement 是相对路径(如 /new),Nginx 会按当前 server 的 root 或 alias 解析;
- 若 replacement 是完整 URL(如 https://example.com/new),则自动转为 302 跳转(等效于加 redirect);
- 测试 rewrite 时建议先用 redirect,确认逻辑正确后再改 permanent,避免浏览器缓存 301 导致调试困难。











