nginx 中有这样的配置
location /media/ {
alias /var/www/media/;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public, max-age=2592000";
}
访问 media 下的文件,怎么地都是 404 ,感觉就是 location /media/ 这段配置没起作用。问了 ds 一下,还真管用:
问题的根本原因是 Nginx 的 location 匹配优先级规则导致的。当您同时存在多个可匹配的 location 块时,Nginx 会根据特定规则选择优先级最高的那个,而不是合并它们的配置。
请求处理流程:
- 当访问 /media/image.jpg 时:匹配 location /media/ (前缀匹配),同时也匹配 location ~* .(js|css|png|…)$ (正则匹配)
- Nginx 的 location 优先级规则:正则匹配 (~ 和 ~*) 优先级高于 前缀匹配 (/path/)。即使前缀匹配写在前面,正则匹配仍然优先
- 结果:请求被第二个正则 location 处理,该 location 没有指定 alias 或 root 指令,Nginx 使用默认的 root 路径(通常是 /usr/share/nginx/html),在默认路径下查找 /media/image.jpg → 文件不存在 → 返回 404
解决办法:
location /media/ {
alias /var/www/media/;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
# 其他静态文件缓存(不影响/media)
location ~* \.(js|css|woff2)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public, max-age=2592000";
}