nginx 中 rewrite 重定向静态资源路径需依 flag 区分行为:last 重新匹配 location,break 停止后续 rewrite,redirect 返回 302,permanent 返回 301;应结合 location、root/alias 确保文件可访问,并通过 rewrite_log 调试。

在 Nginx 中,用 rewrite 重定向静态资源路径,核心是匹配请求 URI 并将其映射到实际文件位置或新路径,同时注意是否触发内部重写还是外部跳转。
区分 rewrite 的 flag:last、break、redirect、permanent
rewrite 规则的行为取决于结尾的 flag,这对静态资源路径重定向很关键:
-
last:停止当前 location 的处理,用新 URI 重新匹配 location 块(常用于内部路径改写,比如把
/static/js/app.js改成/assets/js/app.js) - break:停止后续 rewrite 指令,但不重新匹配 location(适合简单路径替换,避免循环)
- redirect:返回 302 临时跳转(客户端 URL 地址栏会变)
- permanent:返回 301 永久跳转(适合 SEO 友好的路径迁移)
重写静态资源路径的典型场景与写法
常见需求如统一静态资源前缀、迁移旧路径、适配构建输出目录:
- 把所有
/res/xxx请求指向/static/xxx(内部重写):
rewrite ^/res/(.*)$ /static/$1 last; - 将老版本 CSS 路径
/css/v1/style.css永久跳转到新路径:
rewrite ^/css/v1/(.*)$ /css/style.css permanent; - 为前端打包后的资源加哈希前缀,但保留原始请求路径(配合 alias 或 root):
location /static/ {
rewrite ^/static/(.*)$ /dist/static/$1 break;
alias /var/www/myapp/dist/static/;
}
配合 location 和 root/alias 使用更可靠
单纯靠 rewrite 不一定能定位到文件,尤其涉及目录层级时。推荐结合 location 块和 root 或 alias:
- 用
root:拼接完整路径(root /var/www;+ 请求/img/logo.png→ 实际读取/var/www/img/logo.png) - 用
alias:直接替换 location 路径(location /images/ { alias /data/pics/; }→ 请求/images/cat.jpg对应/data/pics/cat.jpg) - rewrite 后若需真实文件服务,确保最终路径能被 root/alias 正确解析,否则返回 404
调试技巧:打开 rewrite 日志快速定位问题
rewrite 执行过程不易观察,开启日志可确认是否匹配、是否重复执行:
- 在 http 或 server 块中添加:
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice; - 注意:日志级别设为
notice或更高,否则可能不输出 rewrite 信息 - 测试时用
curl -I查看响应状态码,确认是 200(内部重写成功)还是 301/302(跳转生效)











