nginx中的location匹配规则介绍
简要概述
location匹配的几个命令的说明,如下
符号 | 说明 |
---|---|
~ | 波浪线表示执行一个正则匹配,区分大小写 |
~* | 表示执行一个正则匹配,不区分大小写 |
^~ | ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 |
= | 进行普通字符精确匹配 |
@ | "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files |
具体详情,请参加官方文档
官方文档理解
前缀匹配
前面带有/
或者/documents/
的为前缀匹配。前缀匹配中,长的前缀匹配会优先于较短的前缀。比如,同时适合/
和/documents/
的前缀匹配,则优先使用/documents/
。
具体事例,可以参加下面代码,规则2和规则3都是前缀匹配。
正则匹配
前面带有~*
修饰符(不区分大小写)或~
修饰符(区分大小写)的匹配为正则。nginx首先检查前缀匹配,记住匹配前缀的最长的匹配项。最后再按照在正则匹配出现的顺序搜索,在第一个适合的匹配项上终止,并使用相应的配置,不再对后面的正则匹配进行搜索了。
如果没有匹配到合适的正则匹配项的话,则就会使用前面记住的前缀匹配。
精确匹配
使用=
修饰符定义的匹配项为精确匹配。如果找到完全匹配的内容,搜索将终止,直接使用精确匹配出的匹配项,不再搜索后续的匹配项。
例如,如果/
请求频繁发生,则定义location = /
将加快这些请求的处理速度,因为搜索将在第一次比较后立即终止
实例展示
官方给出了一个实例,这里展示,并做简要说明:
# 规则1[精确匹配]
location = / {
# 将只会匹配到 "/",因为它是精确匹配。
}
# 规则2[前缀匹配]
location / {
# 将会匹配类似于"/index.html"这样的请求。
# 同时,它也会匹配到其他规则匹配不到任何请求
}
# 规则3[前缀匹配]
location /documents/ {
# 将会匹配到类似于"/documents/document.html"这样的请求
# 带有"/documents/"开头的路径,在规则1,规则4和规则5都匹配不到的情况下,都将会使用当前匹配。
}
# 规则4[正则匹配]
location ^~ /images/ {
# 将会匹配到类似于"/images/1.gif"的请求。
# 任何带啊有"/images/"开头的请求都会被转发到这里,虽然规则5也能匹配到"/images/1.gif",但是由于当前规则写在规则5之前,当前规则已经匹配,所以就不再向下匹配了。
}
# 规则5[正则匹配]
location ~* \.(gif|jpg|jpeg)$ {
# 将会匹配到类似于结尾为".jpg"的请求。
# 虽然规则3也能匹配到"/documents/1.jpg",但是由于本规则是正则匹配,所以会覆盖掉规则3的匹配。这就是正则匹配覆盖掉前缀匹配的例子。
}
另外,推荐大家去参考Nginx location 正则这里对规则做了非常详细的说明。
root 和alias指令区别
- alias的实例
若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件location /img/ { alias /var/www/image/; }
- root实例
若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。]location /img/ { root /var/www/image; }
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用/
结束,否则会找不到文件的,root则可有可无。