文章最后更新时间:2022年10月06日已超过785天没有更新。
前言:
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"
这个目录下确实没有test.html文件,说明是这个location生效
location /test.htm { root /home/tp; }
结论:一般匹配,匹配的值最长的生效
总结:location的命中过程
1、先判断精准匹配,如果命中,立即返回结果并结束解析过程。
2、判断普通命中,如果有多个命中,记录最长的命中结果(注意:记录最长的值但不结束,继续匹配)
3、继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功,立即返回结果,并结束解析过程
延伸分析:
a:普通命中,顺序无所谓,因为按命中的长短来确定的
b:正则命中,先命中为准
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。