全面掌握Nginx location指令:配置示例与最佳实践
Nginx的location指令示例
在Nginx服务器块中的location指令可以将请求路由到文件系统中的正确位置。该指令用于告诉Nginx在匹配location块与URL时在哪里查找资源,包括文件和文件夹。在本教程中,我们将详细了解Nginx的location指令。
先决条件
- 您已经按照我们的教程安装了Nginx。
Nginx的location指令语法
Nginx的location块可以放置在服务器块内或另一个location块内,但有一些限制。构建location块的语法如下:
location [修饰符] [URI] {
...
...
}
在location块中的修饰符是可选的。在location块中有一个修饰符将使Nginx以不同的方式处理URL。最常见的几个修饰符是:
- 无修饰符:如果location块中没有修饰符,则请求的URI将与请求URI的开头进行匹配。
- =:等号用于精确匹配请求URI的location块。
- ~:波浪号用于对请求URI进行区分大小写的正则表达式匹配。
- ~*:波浪号后跟星号用于对请求URI进行不区分大小写的正则表达式匹配。
- ^~:插入符号后跟波浪号用于对请求URI执行最长非正则表达式匹配。如果请求URI命中这样的location块,则不会进行进一步的匹配。
Nginx如何选择一个location块
一个location可以通过使用前缀字符串或使用正则表达式来定义。区分大小写的正则表达式使用”~”修饰符指定,而对于不区分大小写的正则表达式,则使用”~*”修饰符。为了找到与URI匹配的location,Nginx首先扫描使用前缀字符串(不包括正则表达式)定义的location。然后,按照它们在配置文件中声明的顺序检查使用正则表达式的location。Nginx会按照以下步骤对比请求的URI来选择一个location块。
- Nginx首先查找使用location = /some/path/指定的精确匹配,如果找到匹配,则立即使用该块处理请求。
- 如果没有这样的精确location块,则Nginx继续匹配最长的非精确前缀,如果找到使用了^~修饰符的匹配,则Nginx将停止进一步搜索,并选择该location块来处理请求。
- 如果匹配的最长前缀location不包含^~修饰符,则该匹配将被临时存储,并继续执行以下步骤。Nginx现在将搜索转移到包含~和~*修饰符的location块,并选择第一个匹配请求URI的location块,该块将立即被选中以处理请求。如果在上述步骤中没有找到可以与请求URI匹配的location,则使用之前存储的前缀location来处理请求。
Nginx location块示例
让我们列举出一些使用修饰符和URI的Nginx location块的例子。
1. 匹配所有请求的Nginx location
在下面的示例中,前缀location”/”将匹配所有请求,但仅在找不到其他匹配时作为最后的选择。
location / {
...
}
2. 匹配精确URL的Nginx location
Nginx始终首先尝试匹配最具体的前缀location。因此,以下location块中的等号强制与所请求的路径进行精确匹配,然后停止继续搜索其他匹配项。
location = /images {
...
}
上述location块将与URL https://domain.com/images 匹配,但不会匹配URL https://domain.com/images/index.html或https://domain.com/images/。
3. 用于目录的Nginx location块
以下location块将匹配以/images/开头的任何请求,然后继续搜索请求的URI的更具体location块。因此,如果Nginx找不到更具体的匹配项,将选择该location块。
location /images/ {
...
...
}
4. Nginx正则表达式location示例
以下location块中的修饰符^~会导致最长非正则表达式匹配。因此,URI /images或/images/logo.png将被匹配,但在找到匹配项后停止搜索。
location ^~ /images {
...
...
}
5. 图片/CSS/JS文件类型的Nginx location块
下一个location块中的修饰符~*匹配以png、ico、gif、jpg、jpeg、css或js结尾的任何请求(不区分大小写)。然而,对/images/文件夹的所有请求将由前一个location块提供服务。
location ~* \.(png|ico|gif|jpg|jpeg|css|js)$ {
...
...
}
6. Nginx location正则表达式区分大小写的匹配
在以下location的修饰符~导致了一个区分大小写的正则表达式匹配,但不会停止寻找更好的匹配。
location ~ /images {
...
...
}
7. Nginx正则表达式忽略大小写匹配示例
在下面的location块中,修饰符 ~* 导致不区分大小写的正则表达式匹配,但搜索不会在此处停止以获得更好的匹配。
location ~* /images {
...
...
}
总结
理解Nginx的location指令对于追踪文件系统中请求的URI的终点至关重要。本文讨论的修饰符、选择location块的步骤以及一些示例将帮助您轻松入门Nginx中的location块。