nginx rewrite指令用于修改请求uri,语法为rewrite [flag];支持last、break、redirect、permanent等标志,适用于跳转、路径标准化及seo优化。

Nginx 中的 rewrite 指令用于在请求处理过程中修改 URI 路径,常用于跳转、路径标准化、SEO 优化或兼容旧链接。它必须写在 server 或 location 块中,且执行顺序受上下文和标志影响。
rewrite 基本语法与匹配规则
rewrite 指令格式为:rewrite [flag];
其中:
- 正则表达式作用于当前请求的 URI(不含域名和参数),例如请求
/old/page?id=1,匹配的是/old/page - 替换字符串可包含捕获组(如
$1、$2)或变量(如$args保留原始参数) - 常用 flag 包括:
last:终止当前 location 匹配,用新 URI 重新搜索 location;break:停止 rewrite 处理,不重新匹配;redirect:返回 302 临时跳转;permanent:返回 301 永久跳转
常见使用场景与写法示例
1. 简单路径跳转(301)
把 /old-article/123 永久跳转到 /article/123:
rewrite ^/old-article/(.*)$ /article/$1 permanent;
2. 内部重写(不暴露跳转)
将 /api/v1/users 代理到后端 /v1/users,但浏览器地址栏不变:
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://backend;
}
3. 添加或移除前缀
统一为静态资源加 /static 前缀,但文件实际存放在根目录:
location /static/ {
rewrite ^/static/(.*)$ /$1 break;
try_files $uri =404;
}
注意事项与易错点
- rewrite 在
location中执行时,若未加last或break,会继续执行后续 rewrite(可能意外覆盖) - 正则中的
^和$表示严格起止,漏写可能导致误匹配(如/old匹配/old-page) - 多个 rewrite 连续出现时,前一个的输出是后一个的输入,需注意顺序和 flag 选择
- 如果想保留原始 query string,替换串中显式加上
$args,例如:rewrite ^/search$ /search-new?$args? last;
调试 rewrite 的实用方法
开启 Nginx 重写日志可快速定位问题(仅用于调试,勿在生产长期开启):
rewrite_log on; error_log /var/log/nginx/rewrite.log notice;
日志会记录每次匹配、替换过程,便于验证正则是否生效、捕获是否正确。











