最清晰常用的方式是用 ~* 不区分大小写正则匹配。需按从上到下顺序配置,具体规则前置,避免被 ^~ 或 = 拦截;uri 不含查询参数,末尾斜杠影响匹配;可通过 add_header 验证匹配效果。

直接用 ~* 不区分大小写的正则匹配,是最清晰、最常用的方式。关键不是“能不能写正则”,而是选对匹配类型、控制好顺序、把缓存和响应头配到位。
用 ~* 匹配通用后缀,兼顾大小写
图片、脚本、样式、字体这些资源后缀经常混用大小写(比如 .JPG 或 .Css),必须用 ~*:
-
location ~* \.(js|css|json|svg)$—— 匹配 JS/CSS/JSON/SVG,适合设 1 小时缓存 -
location ~* \.(jpg|jpeg|png|gif|webp)$—— 图片类,可加Vary Accept支持 WebP 自适应 -
location ~* \.(woff2?|ttf|eot|otf)$—— 字体文件,建议设 1 年缓存 +immutable
注意:正则按配置从上到下扫描,一旦命中就停止。所以更具体的规则(如 \.min\.js$)要放在宽泛规则(如 \.js$)前面,否则会被提前截断。
避免被 ^~ 或 = 拦截导致正则失效
如果同时用了 location ^~ /static/,那么访问 /static/logo.png 会直接走这个前缀块,根本不会进入 ~* \.png$ 的正则匹配。这意味着:
- 缓存策略(如
expires 30d)必须写在^~块内部,不能指望靠单独的正则块补上 - 想统一管理图片缓存,要么全用正则(不设
^~),要么把正则逻辑合并进^~块里 -
=精确匹配(如location = /favicon.ico)优先级最高,也会跳过所有正则
别漏掉关键细节:URI 不含查询参数,路径末尾斜杠影响匹配
Nginx 匹配的是解码后的 URI 路径,不包括 ?xxx=yyy 部分。例如:
-
/logo.png?v=2的 URI 是/logo.png,仍能被~* \.png$正确匹配 -
location ~* \.js$不会匹配/app.js/(结尾有斜杠),因为$锚定字符串结尾 - 若需兼容带斜杠的伪静态路径,可改用
location ~* \.js(/|$)
简单验证是否生效的小技巧
加一条临时日志或响应头,快速确认匹配行为:
- 在 location 块里加
add_header X-Matched-By "js-rule"; - 用 curl 请求一个 JS 文件:
curl -I https://yoursite/app.js - 看响应头里有没有
X-Matched-By,就能知道走的是哪个 location
不复杂但容易忽略











