文章最后更新时间:2025年06月12日
前言:
location是根据url传回来的值进行匹配,然后进行相应的定位。在虚拟主机的配置中,是必不可少的。location可以将网站的不同部分,定位到不同的处理方式上。
一、Nginx常用的正则表达式
1、nginx正则表达式的字符含义
字符 | 含义 |
---|---|
. |
匹配任意单个字符 |
^ |
行首锚定,用于模式的最左侧 |
$ |
行尾锚定,用于模式的最右侧 |
* |
匹配前面字符任意次(包括0次) |
? |
0或1次 |
+ |
1次或多次(1次或以上) |
\\ |
转义符 |
\\d |
只匹配数字 |
{n} |
重复n次 |
{n,} |
至少n次(n次或以上) |
{n,m} |
n到m次 |
[ ] |
定义匹配字符的范围,只匹配一次 |
[c] |
单个字符 |
[a-z] |
匹配任意小写字母 |
[a-zA-Z0-9] |
匹配任意字母和数字 |
() |
表达式的开始和结束位置 |
a | b |
或运算符a|b |
2、location常用的匹配规则
规则表达式 | 规则含义 |
---|---|
= |
精确匹配 |
^~ |
普通字符匹配,使用前缀匹配,匹配成功则不再匹配其他location |
~ |
正则匹配,区分大小写 |
~\* |
正则匹配,不区分大小写 |
二、location匹配规则
url地址:http://xxx.com/test 会取出“/test”的值与 location /who_test.html location 的 ‘/who_test.html’ 值 匹配
1、生成三个文件,内容分别如下:
[root@WEB nginx]# cat test/test.html
<h1>test.html</h1>
[root@WEB nginx]# cat /home/test/test.html
<html>
<meta charset='UTF-8 '/>
我是正则匹配出来的test
</html>
[root@WEB nginx]# cat /home/tp/123.html
<h1>/home/tp/123</h1>
2、配置文件如下:
location /test.html{
root test;
}
location /who_test.html {
root test;
}
location /123 {
root /home/tp;
}
location ~ test {
root /home/test;
}
3、验证谁生效
结论:正则匹配的值覆盖了一般匹配的值,优先级比一般匹配高
4、把一般匹配修改成精准匹配
location = /test.html{#精准匹配
root test;
}
location /who_test.html {
root test;
}
location /123 {
root /home/tp;
}
location ~ test {
root /home/test;
}
结论:精准匹配优先级大于正则匹配,精准匹配生效
5、多个一般匹配冲突
location /test.ht{
root test;
}
location /who_test.html {
root test;
}
location /test.htm {
root /home/tp;
}
location /test.h {
root /home/test;
}
找不到文件,查看报错路径
[root@WEB nginx]# tail -1 logs/error.log
2022/09/30 16:17:35 [error] 1684083#0: *58498 open() "/home/tp/test.html" failed (2: No such file or directory), client: 157.122.113.58, server: www.liudx.cn, request: "GET /test.html HTTP/1.1", host: "liudx.cn"
结论:一般匹配中,匹配值最长的生效
总结:location的命中过程
- 先判断精准匹配,如果命中,立即返回结果并结束解析过程。
- 判断普通命中,如果有多个命中,记录最长的命中结果(注意:记录最长的值但不结束,继续匹配)
- 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功,立即返回结果,并结束解析过程
延伸分析:
- 普通命中:顺序无所谓,按命中的长短来确定
- 正则命中:先命中为准
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。