简要概述

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的实例
location /img/ {
    alias /var/www/image/;
}
  • root实例
location /img/ {
    root /var/www/image;
}

alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用/结束,否则会找不到文件的,root则可有可无。