Nginx rewrite规则无权重概念,严格按配置顺序、上下文(server/location)及匹配类型(前缀/正则)生效;server级rewrite先执行,location内rewrite自上而下依次执行,last重匹配location,break终止当前rewrite不重匹配,redirect/permanent立即返回并结束请求。

Nginx 的 rewrite 规则优先级主要由执行顺序和匹配方式共同决定,不是靠“权重”或“优先级数字”,而是严格按配置中出现的先后顺序、所处上下文(server、location)以及匹配类型(前缀匹配 vs 正则匹配)来生效。
rewrite 指令本身按书写顺序执行
在同一个配置块(如 server 或 location 内),所有 rewrite 指令从上到下依次执行。一旦某条 rewrite 触发了重定向(return 301/302)或内部重写(break、last),后续 rewrite 就不再执行。
- 使用 last:终止当前 location 的 rewrite 处理,重新匹配新的 location(可能再次进入 rewrite 流程)
- 使用 break:终止当前 rewrite,但不重新匹配 location,直接继续处理后续指令(如 try_files)
- 使用 redirect 或 permanent:立即返回 302/301,请求结束,不再执行后续任何 rewrite
location 块决定 rewrite 是否有机会运行
rewrite 只有在匹配到的 location 块内才会执行。而 location 匹配本身有一套优先级规则:
- 精确匹配(
location = /path)优先级最高 - 前缀匹配(
location /path)按最长前缀匹配,且不区分大小写 - 正则匹配(
location ~ /regex或location ~* /regex)按配置顺序从上到下查找,第一个匹配成功即停止 - 正则匹配优先于最长前缀匹配(除非前缀匹配用了
=或^~)
也就是说,如果一个请求被正则 location 捕获,那它里面的 rewrite 就会运行;如果被前缀 location 捕获,就只运行那个 location 里的 rewrite。
server 级 rewrite 在 location 之前执行
写在 server 块里、不在任何 location 中的 rewrite,会在请求进入 location 之前统一执行。它对所有请求生效(除非被 if 判断限制),且执行完才进入 location 匹配阶段。
- 适合做全局路径标准化,比如统一去掉末尾斜杠、强制 www 跳转等
- 注意:server 级 rewrite 后若用
last,仍会触发 location 重匹配;用break则直接进入匹配到的 location - 慎用
if+ rewrite 组合,Nginx 官方不推荐在 location 外使用 if,容易引发意外行为
正则 rewrite 的匹配顺序也影响结果
rewrite 指令本身支持正则表达式,其匹配同样遵循“从上到下、第一个匹配即生效”的原则。例如:
rewrite ^/old/(.*)$ /new/$1 permanent; rewrite ^/old/page\.html$ /new/index.html permanent;
第二行永远不会触发,因为第一行已匹配所有 /old/... 路径并跳转。应把更具体的规则放前面。
- 越精确、越靠前的正则 rewrite 越先生效
- 避免重复捕获或覆盖,建议用
^和$明确边界 - 调试时可用
error_log /path/to/log notice;配合rewrite_log on;查看匹配过程(仅用于调试)


















