NGINX 服务器块中的位置指令允许将请求路由到文件系统中的正确位置。该指令用于告诉 NGINX 在哪里查找资源,方法是在将位置块与 URL 进行匹配时包含文件和文件夹。在本教程中,我们将详细了解 NGINX 位置指令。
NGINX 位置块可以放置在服务器块内,也可以放置在另一个位置块内,但有一些限制。构造位置块的语法是:
location [modifier] [URI] {
...
...
}
位置块中的修饰符是可选的。在位置块中添加修饰符将允许 NGINX 以不同的方式处理 URL。最常见的修饰符有:
-
none:如果位置块中没有修饰符,则请求的 URI 将与请求的 URI 的开头进行匹配。
-
=:等号用于将位置块与请求的 URI 精确匹配。
-
~:波形符用于与请求的 URI 进行区分大小写的正则表达式匹配。
-
~*:波浪号后跟星号用于与请求的 URI 进行不区分大小写的正则表达式匹配。
-
^~:克拉后跟波形符用于对请求的 URI 执行最长的非正则表达式匹配。如果请求的 URI 命中这样的位置块,则不会进行进一步的匹配。
可以使用前缀字符串或正则表达式来定义位置。不区分大小写的正则表达式用前面的“指定”~*” 修饰符,对于不区分大小写的正则表达式,“~使用了“修饰符。为了找到 URI 的位置匹配,NGINX 首先扫描使用前缀字符串(不带正则表达式)定义的位置。此后,按照正则表达式在配置文件中声明的顺序检查正则表达式的位置。 NGINX 将执行以下步骤来根据请求的 URI 选择位置块。
- NGINX 首先寻找指定的精确匹配
location = /some/path/
如果找到匹配,则立即提供该块。
- 如果没有这样的精确位置块,那么 NGINX 继续匹配最长的非精确前缀,如果在使用 ^~ 修饰符的地方找到匹配项,那么 NGINX 将停止进一步搜索,并选择该位置块来服务请求。
- If the matched longest prefix location does not contain ^~ modifier then the match is stored temporarily and proceed with following steps.
- NGINX 现在将搜索转移到包含 ~ 和 ~* 修饰符的位置块,并选择与请求 URI 匹配的第一个位置块,并立即选择为请求提供服务。
- 如果在上述步骤中没有找到可以与请求的 URI 匹配的位置,则使用先前存储的前缀位置来服务该请求。
让我们列出一些使用修饰符和 URI 的 NGINX 位置块的示例。
在以下示例中,前缀位置 / 将匹配所有请求,但如果未找到匹配项,则将用作最后的手段。
location / {
...
}
NGINX 总是首先尝试匹配最具体的前缀位置。因此,以下位置块中的等号强制与请求的路径精确匹配,然后停止搜索任何更多匹配项。
location = /images {
...
}
上面的位置块将与 URL 匹配https://domain.com/images
但网址https://domain.com/images/index.html
or https://domain.com/images/
将不会被匹配。
以下位置块将匹配以 /images/ 开头的任何请求,但继续搜索所请求的 URI 的更具体的块。因此,如果 NGINX 没有找到任何更具体的匹配,将选择位置块。
location /images/ {
...
...
}
修饰符^~以下位置块中的结果会导致区分大小写的正则表达式匹配。因此,URI /images 或 /images/logo.png 将被匹配,但一旦找到匹配项就会停止搜索。
location ^~ /images {
...
...
}
修饰符~*下一个位置块匹配任何以 png、ico、gif、jpg、jpeg、css 或 js 结尾的请求(不区分大小写)。然而,任何向/images/
文件夹将由先前的位置块提供服务。
location ~* .(png|ico|gif|jpg|jpeg|css|js)$ {
...
...
}
修饰符~以下位置块中的结果会导致区分大小写的正则表达式匹配,但不会停止搜索更好的匹配。
location ~ /images {
...
...
}
修饰符~*以下位置块中的结果是不区分大小写的正则表达式匹配,但搜索不会在此停止以获得更好的匹配。
location ~* /images {
...
...
}
了解 NGINX 位置指令对于跟踪文件系统中请求的 URI 的端点至关重要。本文讨论的修饰符、选择位置块的步骤以及一些示例将帮助您轻松开始使用 NGINX 中的位置块。