nginx静态资源拦截与重写依赖location精准匹配:用^~优先拦截静态路径,~*统一处理后缀,rewrite实现url重写,return/deny主动拦截。

在 Nginx 中对静态资源做响应拦截与重写,核心不是“先拦再改”,而是**按请求路径和后缀,用 location 精准匹配 + 内置指令控制行为**。它不修改响应体内容,但能决定由谁提供资源、是否重定向、是否加头、是否拒绝访问——这些都算广义的“拦截与重写”。
用 ^~ 优先拦截明确静态路径
对已知前缀的静态目录(如 /static/、/assets/、/images/),必须用 ^~ 修饰符。它一匹配就终止后续所有正则检查,避免被后缀规则干扰。
-
推荐写法:
location ^~ /static/ { root /var/www/dist; }→ 请求/static/js/app.js直接返回磁盘文件,不进任何正则分支 -
避免写法:
location /static/ { ... }(普通前缀)→ 优先级低于~ \.js$,可能被截胡,导致 root 错乱或 404 - 若同时存在
^~ /static/和^~ /static/css/,后者因路径更长而优先生效(最长前缀原则)
用 ~* 统一处理通用后缀
对 CSS、JS、图片、字体等常见后缀,用 ~*(不区分大小写正则)集中配置缓存、压缩、防盗链等策略。它只在第一阶段没命中 = 或 ^~ 时才参与匹配。
location ~* \.(js|css|png|jpg|gif|woff2|ttf|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }- 把它放在所有
^~块之后、location /之前 —— 位置靠前也无效,但放错顺序易引发误读 - 不要拆成多个
~ \.js$、~ \.css$,一个~*覆盖更清晰、无顺序依赖
用 rewrite 实现 URL 重写或跳转
当需要把旧路径映射到新路径(如伪静态、SEO 迁移),用 rewrite 指令,配合 flag 控制流程走向。
-
rewrite ^/article/(\d+)\.html$ /posts/$1 last;→ 把/article/123.html内部重写为/posts/123,浏览器地址栏不变 -
rewrite ^/old/(.*)$ https://new.example.com/$1 permanent;→ 301 永久跳转,传递 SEO 权重 - 搭配
if (!-e $request_filename)可实现“文件不存在时兜底到前端路由”:if (!-e $request_filename) { rewrite ^(.*)$ /index.html break; }
用 return 或 deny 实现主动拦截
对敏感路径或非法请求,不转发、不查找文件,直接响应控制。
-
location ~* (runtime|application|config)/ { return 403; }→ 匹配到就返回 403,禁止访问内部目录 -
location = /favicon.ico { alias /var/www/static/favicon.ico; log_not_found off; }→ 精确匹配,且关闭 404 日志刷屏 -
location /admin/ { deny all; }→ 拒绝所有 IP 访问后台路径











