一、为什么 location 还需要进阶规则¶
基础场景里,location / 或 location /admin/ 已经能解决很多问题。
但一旦网站内容变多,就会出现新的需求:
- 让不同后缀的资源走不同规则
- 给静态资源设置缓存,减轻重复请求压力
- 明确多个
location同时存在时到底谁先匹配
原笔记后半部分正是围绕这些实际问题展开。
二、案例:给静态网站配置浏览器缓存¶
原笔记设计的案例是 bird.oldboylinux.cn:
- 站点目录:
/app/code/bird - 目标:让
html、js、css结尾的文件缓存 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;:给html、js、css等资源设置更长缓存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这类实际应用场景 - 多条规则并存时的优先级
只要把这三点串起来,后面无论是做缓存、静态资源优化,还是更复杂的站点路由控制,都会更有把握。