一、为什么 location 还需要进阶规则

基础场景里,location /location /admin/ 已经能解决很多问题。
但一旦网站内容变多,就会出现新的需求:

  • 让不同后缀的资源走不同规则
  • 给静态资源设置缓存,减轻重复请求压力
  • 明确多个 location 同时存在时到底谁先匹配

原笔记后半部分正是围绕这些实际问题展开。

二、案例:给静态网站配置浏览器缓存

原笔记设计的案例是 bird.oldboylinux.cn

  • 站点目录:/app/code/bird
  • 目标:让 htmljscss 结尾的文件缓存 1 天以上
  • 图片类文件缓存 1 小时

在基础配置中,站点先按普通方式部署:

server {
    listen       80;
    server_name  bird.oldboylinux.cn;
    root   /app/code/bird;
    location / {
        index  index.html;
    }
}

然后上传代码并完成本地 hosts 解析,浏览器访问后可以先观察默认情况下的响应头,原笔记指出初始状态下并没有明显的缓存策略。

三、如何用正则 location 给不同资源设置缓存

原笔记给出的配置思路如下:

server {
    listen       80;
    server_name  bird.oldboylinux.cn;
    root   /app/code/bird;
    location / {
        index  index.html;
    }

    location ~* \.(html|js|css)$ {
        expires max;
    }

    location ~* \.(jpg|jpeg|png|gif|bmp)$ {
        expires 1h;
    }
}

这里有两个非常关键的点。

3.1 ~* 表示正则匹配且不区分大小写

也就是说:

  • .jpg
  • .JPG
  • .Css

这类不同大小写形式都能被匹配到。

3.2 expires 用来控制浏览器缓存时间

原笔记中的两个示例含义是:

  • expires max;:给 htmljscss 等资源设置更长缓存
  • expires 1h;:给图片设置 1 小时缓存

这样浏览器再次访问这些静态资源时,就不一定每次都重新向服务器取完整内容。

四、配置完成后该怎么验证

原笔记建议的步骤是:

1、执行语法检查

nginx -t

2、重载 Nginx

systemctl reload nginx

3、在浏览器里访问 bird.oldboylinux.cn

4、打开开发者工具查看响应头中的缓存相关字段

原笔记还提到,可以通过浏览器 F12 查看 Cache-Control 等响应头,并把结果与百度等网站的缓存策略对比。

五、常见 location 规则分别是什么意思

原笔记总结了几类常见规则:

规则 说明
location / {} 默认保底规则
location /image/ {} 普通前缀匹配
location ~ \.(jpg) 正则匹配,区分大小写
location ~* \.(jpg) 正则匹配,不区分大小写
location ^~ /lidao/ 普通前缀匹配,但优先级更高
location = /50x.html 精确匹配
location @name {} 命名 location,常用于跳转等场景

这张表的意义在于:
Nginx 并不只是“从上到下碰到哪个用哪个”,而是会根据规则类型决定匹配顺序。

六、location 的优先级该怎么记

原笔记给出的优先级顺序是:

优先级 符号
1 =
2 ^~
3 ~~*
4 普通前缀,如 /image/
5 /

可以把它理解成:

  • 越“精确”的规则优先级越高
  • 精确匹配优先于前缀匹配
  • 正则匹配优先于普通前缀
  • / 永远是最后的保底规则

七、通过一个综合案例理解匹配结果

原笔记给出了这样一组配置:

location = / {
   [ configuration A ]
}

location / {
   [ configuration B ]
}

location = /documents/ {
   [ configuration C ]
}

location ^~ /images/ {
   [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
   [ configuration E ]
}

对应测试结果如下:

URI 命中结果
/ A
/index.html B
/documents/document.html C
/images/1.gif D
/documents/1.jpg E

从这个例子可以看出:

  • 完全一致时优先命中精确匹配
  • /images/1.gif 虽然也能被正则命中,但会优先落到 ^~ /images/
  • 普通页面在没有更特殊规则时,最后会落到 location /

八、小结

location 进阶规则时,最重要的是同时掌握三件事:

  • 不同规则类型的写法
  • 正则和 expires 这类实际应用场景
  • 多条规则并存时的优先级

只要把这三点串起来,后面无论是做缓存、静态资源优化,还是更复杂的站点路由控制,都会更有把握。