引言
location是用来设定不同的URI的文件系统路径的映射,一个server中可以包含多个location,nginx会根据用户请求的URI来卓哥判断location,找出最佳的匹配规则,然后使用location定义的配置。
URL与URI
URL=https://www.baidu.com/s?cl=3&tn
URI=/s
?后面是查询,不算在URI里
也就是说,URL是从浏览器复制下来的整个连接,URI是域名后面从/开始的链接。
URL换算nginx配置
https=端口
www.baidu.com=server_name
/s=location(localtion是匹配URI的!!!!!!!!!!/也算URI!!!!!!!!)
匹配符号
符号 | 说明 |
---|
= | 绝对匹配也称精确匹配,优先级最高,如果匹配成功,将停止向下匹配,立即处理请求 | ~ | 区分大小写的正则匹配 | ~* | 不区分大小写的正则匹配 | ^~ | 匹配uri前缀,如果匹配到了uri前缀则结束匹配 | / | 托底匹配,其他匹配没有匹配到时启动该匹配 |
匹配顺序规则
= 大于 ^~ 大于 ~ 等于 ~* 大于 不带字符
演示匹配顺序
server {
listen 81;
root /usr/local/nginx/html/;
location = /image {
return 100;
}
location ^~ /image {
return 200;
}
location ~ /image {
return 300;
}
location ~* /image {
return 400;
}
location /images {
return 500;
}
location / {
return 600;
}
}
首先匹配的是“=”,这也是绝对匹配。
curl -I localhost:81/image
HTTP/1.1 100
Server: nginx/1.20.1
Date: Fri, 10 Dec 2021 15:11:24 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
这里在URI后面加上了个a,匹配到了^~
curl -I localhost:81/imagea
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 10 Dec 2021 15:12:15 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
使用了大写的URI,匹配到了~*
curl -I localhost:81/IMAGE
HTTP/1.1 400 Bad Request
Server: nginx/1.20.1
Date: Fri, 10 Dec 2021 15:13:30 GMT
Content-Type: text/html
Content-Length: 157
Connection: close
——————————————————————————分隔符———————————————————————— URI为images,按照书写应该是会回显500的,但是却回显了300,这里着重说下。 首先,按照匹配顺序来说应该会匹配到^~,回显200,但是,第一次匹配会根据URI长度来匹配,也就是匹配到了“空格”匹配,此时把 ^~的匹配干掉了,再次进行顺序的匹配,这时的优先级最高的是 ~呢,结束匹配,回显300,为什么没有匹配到 ~*,因为 ~在上面。 这里说的不太好,因为牵扯到正则跟字符串的问题,但是思路是这么个思路。
curl -I localhost:81/images
HTTP/1.1 300
Server: nginx/1.20.1
Date: Fri, 10 Dec 2021 15:18:31 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
托底匹配,也就是URI中没匹配到的将启用该配置
curl -I localhost:81/asdad
HTTP/1.1 600
Server: nginx/1.20.1
Date: Fri, 10 Dec 2021 15:23:48 GMT
Content-Length: 0
Connection: keep-alive
|