章节
1 NGINX 的源码安装
2 NGINX 核心配置详解
3 NGINX 之 location 匹配优先级
4 NGINX 基础参数与功能
目录
1 location 基础语法
1.1 location 语法说明表
1.2 URI部分简单介绍
2 location 匹配优先级
2.1 URI匹配的规则与顺序
2.2 精确匹配(location = /1.txt)
2.3 区分大小写(location ~ \.(txt|html|php|png)$)
2.4 不区分大小写(location ~* \.(txt|html|php|png)$)
3 URI优先级匹配案例
3.1 几种方式测试文件匹配优先级
3.1.1 测试location 的访问(同一个文件名不相同的目录)
3.1.2 测试结果
3.1.3 location /documents 存在的特殊性
3.1.4 总结文件匹配测试
3.2 几种方式测试目录匹配优先级
3.2.1 同一文件名不同目录 且 匹配规则是目录
3.2.2 创建目录与index.html 文件
3.3.3 实现效果
3.3.4 总结目录匹配
1 location 基础语法
location 指令的作用是根据用户请求的URI来执行不同的应用。 location使用的语法为
location [=|~|~*|^~] uri {
....
}
1.1 location 语法说明表
location | [=|~|~*|^~] | uri | {....} |
---|---|---|---|
指令 | 匹配标识 | 匹配的网站地址 | 匹配URI后要执行的配置段 |
1.2 URI部分简单介绍
~ 与~* 的区别 ~ 匹配内容区分大小写 ~* 匹配内容不区分的小写
!~ 取反
^~ 但多个匹配同时存在,优先匹配 ^~匹配的内容;不做正则表达式的检查 (优先处理)
location 指令的作用是根据用户请求的URI来执行不同的应用。
不同uri及特殊字符组合匹配的顺序说明
2 location 匹配优先级
2.1 URI匹配的规则与顺序
顺序 | 不用URI及特殊字符组合匹配 | 匹配说明 |
---|---|---|
1 | location = / {} | 精确匹配 / |
2 | location ^~ /1.tx { | 匹配常规字符串,不做正则表达式匹配检查 |
3 | location ~ \.(txt|html|php|png)$ location ~* \.(txt|html|php|png)$ | 正则匹配 区分大小写与不区分大小写 |
4 | location /documents/ { | 匹配常规字符串,如果有正则,则优先匹配正则 |
5 | location / { | 所有location 都不能匹配后的默认匹配 |
2.2 精确匹配(location = /1.txt)
在server部分使用location配置一个web界面,例如:当访问nginx 服务器的/logo.jpg的时候要显示指定
html文件的内容,精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高
2.3 区分大小写(location ~ \.(txt|html|php|png)$)
~ 实现区分大小写的模糊匹配. 以下范例中,
如果访问uri中包含大写字母的logo.PNG,则以下location匹配logo.png条件不成功
因为 ~ 区分大小写,当用户的请求被执行匹配时发现location中定义的是小写的png,
本次访问的uri匹配失败,后续要么继续往下匹配其他的location(如果有),要么报错给客户端
2.4 不区分大小写(location ~* \.(txt|html|php|png)$)
~* 用来对用户请求的uri做模糊匹配,uri中无论都是大写、都是小写或者大小写混合,此模式也都会匹 配,通常使用此模式匹配用户request中的静态资源并继续做下一步操作,此方式使用较多
注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404
3 URI优先级匹配案例
3.1 几种方式测试文件匹配优先级
3.1.1 测试location 的访问(同一个文件名不相同的目录)
# 这里没有增加 location /documents/ 是由于他比较特殊
echo this is 1 > /webdata/nginx/web1/1.txt
echo this is 2 > /webdata/nginx/web2/1.txt
echo this is 3 > /webdata/nginx/web3/1.txt
echo this is 4 > /webdata/nginx/web4/1.txt
echo this is 5 > /webdata/nginx/web5/1.txt
mkdir -p /webdata/nginx/web{1..5}
[root@RHEL-9 conf.d]# vim /usr/local/nginx/conf.d/location02.conf
server {
listen 80;
index index.html;
server_name www.shuyan.com;
location / {
root /webdata/nginx/web1;
}
location = /1.txt {
root /webdata/nginx/web2;
}
location ~ \.(txt|html|php|png)$ {
root /webdata/nginx/web3;
}
location ^~ /1.t {
root /webdata/nginx/web4;
}
}
3.1.2 测试结果
3.1.3 location /documents 存在的特殊性
在配置文件中同时存在 location ^~ /1 和 location /1.txt 匹配规则的时候,location ^~ /1 的优先度会降低,甚至于优先度只比 / 大
3.1.4 总结文件匹配测试
得出结论 在没有location /1.txt 干扰的时候优先级从高到低为 = ^~ (~|~*) /
在有 location /1.txt 的时候 location ^~ /1 的优先级会降低从高到低为 = (~|~*) /1.txt ^~ /
3.2 几种方式测试目录匹配优先级
3.2.1 同一文件名不同目录 且 匹配规则是目录
其实在匹配目录的时候也是一样的 ^~ /t 和 /test 会发生冲突
[root@RHEL-9 conf.d]# vim /usr/local/nginx/conf.d/location02.conf
server {
listen 80;
index index.html;
server_name www.shuyan.com;
location ^~ /t {
root /data/web1;
}
location ~* test {
root /data/web2;
}
location /test {
root /data/web3;
}
location / {
root /data/web4;
}
}
3.2.2 创建目录与index.html 文件
mkdir -p /data/web{1..5}/test
echo web1 > /data/web1/test/index.html
echo web2 > /data/web2/test/index.html
echo web3 > /data/web3/test/index.html
echo web4 > /data/web4/test/index.html
echo web5 > /data/web5/test/index.html
# 重启服务
[root@RHEL-9 ~]# systemctl restart nginx
3.3.3 实现效果
3.3.4 总结目录匹配
^~ /t 和同时出现 /test 会发生冲突
只演示一个效果与以上的文件匹配的是一样的