nginx URL 重写
使用 rewrite 指令实现 URL 重定向和路径改写
语法
rewrite regex replacement [flag];
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
last |
停止当前 rewrite 并重新匹配 location | rewrite ^/old/(.*)$ /new/$1 last; |
常用 |
break |
停止 rewrite 但不重新匹配 | rewrite ^/img/(.*)$ /data/images/$1 break; |
常用 |
redirect |
302 临时重定向 | rewrite ^/temp$ /new redirect; |
常用 |
permanent |
301 永久重定向 | rewrite ^/old$ /new permanent; |
常用 |
return |
直接返回状态码(比 rewrite 更高效) | return 301 https://$host$request_uri; |
常用 |
示例
去掉 URL 末尾斜杠
rewrite ^/(.*)/$ /$1 permanent;
/about/ → /about
旧路径重定向
location /blog {
rewrite ^/blog/post-(\d+)$ /articles/$1 permanent;
}/blog/post-123 → /articles/123
强制 www
server {
server_name example.com;
return 301 https://www.example.com$request_uri;
}用 return 比 rewrite 更高效
API 版本路由
rewrite ^/api/v1/(.*)$ /api/current/$1 last;
内部重写,客户端 URL 不变
常见错误
rewrite 导致无限循环
检查 rewrite 规则是否会匹配自身,用 last 或 break 控制流程
重定向后参数丢失
rewrite 默认保留查询参数,如果不想保留在末尾加 ?
技巧
- 能用 return 就不用 rewrite,return 性能更好
- rewrite 的 last 会重新走 location 匹配,break 不会
- 正则中用 () 捕获,$1 $2 引用