Nginx rewrite指令用于URI重写或跳转,语法为rewrite <正则> <替换> [flag];常用flag包括last(内部重写并重新匹配location)、break(终止重写)、redirect(302跳转)、permanent(301跳转)。

Nginx 的 rewrite 指令用于在请求处理过程中修改 URI,实现 URL 重写(内部重定向)或跳转(外部重定向),是配置路由、兼容旧链接、SEO 优化的常用手段。关键在于理解匹配逻辑、标志位作用和执行时机。
rewrite 基本语法与匹配规则
rewrite 指令写在 server 或 location 块中,格式为:
其中正则表达式基于 PCRE,区分大小写(加 i 标志可忽略大小写);替换目标支持捕获组(如 $1、$2);flag 控制后续行为。
常见 flag:
- last:停止当前 location 中的 rewrite,用新 URI 重新匹配 location(内部重写,不改变浏览器地址栏)
- break:停止所有 rewrite,不再匹配新 location(适合在 location 内做路径修正)
- redirect:返回 302 临时跳转(地址栏变化)
- permanent:返回 301 永久跳转(地址栏变化,利于 SEO)
实现基础 URL 重写(内部重写)
把用户访问的友好路径映射到后端真实路径,不暴露实际结构。例如将 /article/123 改写为 /index.php?aid=123:
注意:last 会让 Nginx 用 /index.php?aid=123 再次查找匹配的 location(比如匹配 ~ \.php$),从而交由 PHP 处理。
若想限制仅在某个 location 内生效,可直接写在该块里,并用 break 避免重复匹配:
rewrite ^/old/(.*)$ /new/$1 break;
root /var/www/html;
}
实现外部跳转(301/302)
当页面永久迁移或域名更换时,用 permanent 或 redirect 返回状态码并跳转:
- 全站 HTTP 跳 HTTPS:
rewrite ^(.*)$ https://$host$1 permanent; - 旧文章路径跳转:
rewrite ^/post/(\d+)\.html$ /article/$1 permanent; - 屏蔽特定 User-Agent 访问(配合 return):
if ($http_user_agent ~* "badbot") { return 403; }(注意:if 在 location 外慎用,优先考虑 map + return)
⚠️ 注意:避免在 if 中使用 rewrite(尤其在 location 外),Nginx 官方不推荐,易引发意外行为;应尽量用 return 或 try_files 替代。
调试与验证技巧
rewrite 执行顺序和 location 匹配逻辑容易出错,建议:
- 开启
error_log /path/to/error.log notice;,rewrite 相关动作在notice级别会输出日志 - 用
curl -I查看响应头中的Location和状态码,确认是否跳转及类型 - 测试时先用
redirect,确认逻辑正确后再换permanent,避免缓存干扰 - URI 开头的
/必须显式匹配(如^/old/),不能省略;正则中^和$表示严格起止,避免误匹配


















