注意Nginx 的 location 匹配优先级规则

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";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值