Nginx静态资源优先处理需按四层优先级匹配:精确匹配(=)→优先前缀(^~)→正则(~)→普通前缀;/static/等目录必须用^~锁定,避免被正则截获;=用于/favicon.ico等固定路径;通用后缀用单一~规则置于^~之后;location /必须放最后。

要让特定静态资源(如 /static/、/assets/、/images/)被 Nginx 优先处理,关键不是把规则写在配置文件前面,而是用对 location 修饰符和匹配逻辑。Nginx 不按书写顺序选规则,而是严格按四层优先级逐级匹配:精确匹配 → 优先前缀匹配 → 正则匹配 → 普通前缀匹配。
用 ^~ 锁定静态目录,立即终止后续匹配
对明确路径前缀的静态资源目录,必须使用 ^~ 修饰符。它一匹配就停止所有正则检查,避免被后面的 ~ \.js$ 或 ~* \.png$ 规则干扰。
-
location ^~ /static/ { alias /var/www/app/static/; }→ 请求/static/css/app.css直接命中,不进任何正则分支 - 别写成
location /static/ { root ... },它优先级低于正则,可能被location ~ \.css$截胡,导致路径拼错 - 若同时存在
^~ /static/和^~ /static/js/,后者因路径更长而优先生效(最长前缀原则)
用 = 精确匹配固定小资源
首页、图标、健康检查等固定路径资源适合 =,它是最高优先级,且只响应完全一致的 URI(不带查询参数、不自动补斜杠)。
location = /favicon.ico { alias /var/www/static/favicon.ico; log_not_found off; }-
location = /healthz { return 200 "OK"; }和location / { proxy_pass http://backend; }可共存,前者一定先执行 - 不要为同一路径既写
=又写普通前缀,会造成冗余或冲突
后缀统一由 ~* 处理,放在 ^~ 块之后
通用文件后缀(如 .js、.css、.png、.woff2)推荐用一个 ~* 规则覆盖,不区分大小写,且只在前两步未命中时才参与匹配。
location ~* \.(js|css|png|jpg|gif|svg|woff2|ttf)$ { expires 1y; add_header Cache-Control "public, immutable"; }- 这条规则必须放在所有
^~和=块之后;即使它写在最前面,^~ /static/仍会短路它 - 避免拆成多个
~ \.js$、~ \.css$,否则顺序依赖易出错
兜底规则 location / 必须放最后
location / 是普通前缀匹配,优先级最低,仅在前面所有类型都未命中时才生效。把它提前会截断其他更具体的规则。
- 多数场景不需要显式写
location /,应由更具体的^~或=覆盖 - 真需要全局代理或 fallback 时,确保它位于 server 块末尾
- 例如:
location /api/ { proxy_pass http://backend; }应在^~ /static/之后、location /之前


















