最有效方式是按后缀用location块匹配静态资源:优先用^~匹配静态目录,其次用~*不区分大小写正则匹配通用后缀,最后用=精确匹配关键文件;需严格遵循优先级顺序避免误匹配。

直接用 location 块按文件后缀匹配静态资源是最常用也最有效的方式,关键在于选对匹配类型、设好响应头,并避开优先级陷阱。
用正则匹配常见静态资源后缀
不区分大小写的正则(~*)最适合处理图片、脚本、样式等通用资源:
location ~* \.(js|css|svg)$ { expires 1h; add_header Cache-Control "public"; }location ~* \.(jpg|jpeg|png|gif|webp)$ { expires 30d; add_header Cache-Control "public, immutable"; }location ~* \.(woff2?|ttf|eot|otf)$ { expires 1y; add_header Cache-Control "public, immutable"; }
注意:正则规则按配置顺序从上到下匹配,更具体的规则(比如 .js5)应放在更宽泛的规则(比如 .js)前面。
用 ^~ 提升静态目录性能并阻断干扰
对高频访问的静态资源目录(如 /static/、/assets/),优先使用 ^~ 前缀匹配:
location ^~ /static/ { alias /var/www/static/; expires 1h; }- 它会跳过后续所有正则检查,避免被
~ \.php$或~* \.jpg$等规则误拦截 - 与
alias搭配时路径拼接更直观;若用root,需注意末尾斜杠和 URI 映射关系
精确匹配关键资源提升响应速度
对固定路径的资源(如 favicon、robots.txt、健康检查端点),用 = 精确匹配可减少匹配开销:
location = /favicon.ico { log_not_found off; expires 1y; add_header Cache-Control "public, immutable"; }location = /robots.txt { alias /var/www/static/robots.txt; }- 匹配成功立即终止搜索,不向下继续比对其他 location
避免常见坑:优先级与路径细节
location 匹配不是“谁写在前面就听谁的”,而是严格按优先级执行:
- 最高:精确匹配
= /xxx - 其次:
^~ /prefix(前缀匹配 + 阻断正则) - 再其次:
~和~*正则(按配置顺序取第一个命中) - 最后:普通前缀匹配
/prefix(最长前缀胜出)
例如,location ^~ /static/ 和 location ~* \.png$ 同时存在时,访问 /static/logo.png 只走前者,不会触发 PNG 的缓存设置——所以要把缓存策略写进 ^~ 块内部,而不是依赖单独的正则块。











