0%

nginxLocation模块学习

uri 匹配规则

location 规则类型

这部分内容来自详细解析 nginx uri 如何匹配 location 规则

= exact uri

完全匹配规则,要求 url 和规则完全相同

1
2
3
location ~ /api/v1 {
....
}
~ case-sensitive regex

区分大小写的正则表达式匹配规则

1
2
3
location ~ /api/v1 {
....
}
~* case-insensitive regex

不区分大小写的正则表达式匹配规则

1
2
3
location ~ /api/v1 {
....
}
~* case-insensitive regex

不大小写的正则表达式匹配规则

1
2
3
location ~ /api/v1 {
....
}
^~ disable regex prefix

匹配流程与 prefix 规则相同,有一点区别在于,如果最长匹配是当前规则,则之后不进行 正则表达式 规则的搜索。

1
2
3
location ~ /api/v1 {
....
}

uri 如何选择 location

  1. 如果存在 exact uri 规则与 uri 匹配,至步骤 6
  2. 在所有 prefix 规则和 disable regex prefix 规则中进行匹配(与这些规则定义的顺序无关),
    如果没有匹配到规则,至步骤 3;如果存在匹配的规则,选择出最长匹配 uri 的规则:

    • 如果规则是 disable regex prefix 类型,至步骤 6
    • 如果规则是 prefix 类型,记住当前匹配的 prefix 规则,选为待定,至步骤 3
  3. 逐个遍历 case-sensitive regex 规则和 case-insensitive regex 规则(按照这些规则定义的前后顺序):

    • 如果规则匹配,则遍历终止,至步骤 6
    • 如果规则没有匹配,则继续
  4. 如果之前有 prefix 规则条目被选择为待定,至步骤 6

  5. 匹配失败,返回 404,结束
  6. 选择当前规则,使用其配置,结束

try_files 解析

$uri 指代访问的 uri 资源,$uri/语法可以用来检测一个目录的存在,如果没有找到,一个内置的重定向将请求重定向到最后一个参数
最后一个参数可以指向一个命名的 location

1
2
3
4
5
6
7
8
9
10
11
12
location / {
try_files $uri $uri/ index.html $uri.html =404;
}
location / {
try_files /system/maintenance.html
$uri $uri/index.html $uri.html
@mongrel;
}

location @mongrel {
proxy_pass http://mongrel;
}