应优先用 location 匹配静态后缀并终止重写流程,如 location ~* .(js|css|png|jpg|gif|ico|svg|woff2?)$ { expires 1y; add_header cache-control "public"; },避免 if 判断;若需 fallback 可用 try_files $uri $uri/ /index.html 自动跳过静态文件。

在 Nginx 中,若想让 rewrite 规则跳过某些特定后缀的静态文件(如 .js、.css、.png 等),核心思路是:**先匹配这些后缀并提前终止重写流程**,避免它们被后续的 rewrite 捕获处理。
用 location 匹配后缀并 return 200 或 break
最推荐的方式是利用 location 的前缀匹配或正则匹配,对目标后缀做“短路”处理:
- 使用
location ^~ /或location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?)$显式声明静态资源路径 - 在该 location 块中不写
rewrite,而是用expires、add_header等优化静态资源,或直接try_files $uri =404 - 关键点:Nginx 的
location匹配优先级高于rewrite(rewrite 在 server 或 location 内执行,但 location 已决定进入哪个作用域)——只要请求命中了这个静态资源 location,就不会再进入含 rewrite 的 location
在 rewrite 前加 if 判断后缀(不推荐但可用)
如果必须在同一个 location 内控制 rewrite 行为,可用 if 配合正则判断 URI 后缀,然后跳过 rewrite:
if ($request_uri ~* "\.(js|css|png|jpg|gif|ico|svg|woff2?)$") { break; }- 紧接着写你的
rewrite ^/old/(.*)$ /new/$1? permanent; - ⚠️ 注意:
if在 location 中虽可用,但 Nginx 官方不建议在 location 外使用;且if + rewrite组合在复杂场景下易出意外交互,应尽量用 location 分离逻辑
用 try_files 隐式跳过 rewrite
当 rewrite 目的是实现前端路由 fallback(如 SPA 的 history 模式),可改用 try_files 替代 rewrite,并天然避开静态文件:
try_files $uri $uri/ /index.html;- Nginx 会先检查
$uri是否对应真实文件(如/app.js),存在则直接返回,不走后面的/index.html - 这就自动实现了“有静态文件就返回,没有才重写到入口”,无需手动过滤后缀
验证是否生效的小技巧
配置完成后,可通过以下方式确认规则未误伤静态资源:
- 访问
https://yoursite.com/style.css,检查响应状态码是否为 200(不是 301/302)且 Content-Type 正确 - 用
curl -I查看响应头,确认无Location字段(说明未触发重定向 rewrite) - 开启 Nginx
error_log /path/to/log notice;,配合rewrite_log on;(仅调试用)观察重写日志











