location配置详解

匹配规则

关于一些对location认识的误区

1、 location 的匹配顺序是“先匹配正则,再匹配普通”。

矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”。我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家平时习惯的按“先匹配正则,再匹配普通”的实践经验。这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,后面会详细解释)。

2、 location 的执行逻辑跟 location 的编辑顺序无关。

矫正:这句话不全对,“普通 location ”的匹配规则是“最大前缀”,因此“普通 location ”的确与 location 编辑顺序无关;但是“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;“普通location ”与“正则 location ”之间的匹配顺序是?先匹配普通 location ,再“考虑”匹配正则 location 。注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则。

总结一句话: “正则 location 匹配让步普通 location 的严格精确匹配结果;但覆盖普通 location 的最大前缀匹配结果”

参考:关于一些对location认识的误区

匹配规则

location [ = | ~ | * | ^ ] /URI { … } # 匹配 URI 类型,有四种参数可选,当然也可以不带参数。

location @/name/ { … } # 命名location,用@来标识,类似于定义goto语句块

Location 块通过指定模式来与客户端请求的URI相匹配。

标识符 描述
空格 普通匹配(最长字符匹配);与location顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。
= 精确匹配:用于标准uri前,要求请求字符串和uri严格匹配。如果匹配成功就停止匹配,立即执行该location里面的请求。
^~ 非正则匹配;用于标准uri前,nginx服务器匹配到前缀最多的uri后就结束,该模式匹配成功后,不会使用正则匹配。
~ 正则匹配:用于正则uri前,表示uri里面包含正则,并且区分大小写
~* 正则匹配:用于正则uri前,表示uri里面包含正则,不区分大小写
@ @ 定义一个命名的 location,@ 定义的locaiton名字一般用在内部定向,例如error_page, try_files命令中。它的功能类似于编程中的goto。
  • 空格 :默认匹配,普通匹配
1
2
3
location / {
root /home;
}
  • = :精确匹配
1
2
3
location = /file/img/face1.png { 
root /home;
}
  • ~* :匹配正则表达式,不区分大小写
1
2
3
4
# 符合图片的显示 
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
  • ~ :匹配正则表达式,区分大小写
1
2
3
4
#GIF必须大写才能匹配到 
location ~ \.(GIF|jpg|png|jpeg) {
root /home;
}
  • ^~ :以某个字符路径开头
1
2
3
location ^~ /static/img { 
root /home;
}

root和alias的区别

  • root的真实的路径是root值+location值,alias会去掉location的值,直接访问alias的路径对应的文件
  • alias 只能作用在location中,而root可以存在server、http和location中。
  • alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无。

例如:当用户请求: http://ip:port/static/test.gif 这个地址时,

1
2
3
location /static/ {
root /file/img;
}

实际访问: /file/img/static/test.gif

1
2
3
location /static/ {
alias /file/img;
}

实际访问: /file/img/test.gif