如何在 NGINX 配置中为两个位置设置相同的规则?
How can I have same rule for two locations in NGINX config?
如何在 NGINX 配置中为两个位置设置相同的规则?
我试过以下方法
server {
location /first/location/ | /second/location/ {
..
..
}
}
但是 nginx 重新加载抛出了这个错误:
nginx: [emerg] invalid number of arguments in "location" directive**
尝试
location ~ ^/(first/location|second/location)/ {
...
}
~
表示对url使用正则表达式。 ^
表示从第一个字符开始检查。这将查找 /
后跟任一位置,然后是另一个 /
.
另一种选择是使用包含文件在两个前缀位置重复规则。由于前缀位置在配置中与位置无关,因此使用它们可以在您稍后添加其他正则表达式位置时避免一些混乱。尽可能避免使用正则表达式位置将有助于您的配置顺利扩展。
server {
location /first/location/ {
include shared.conf;
}
location /second/location/ {
include shared.conf;
}
}
这是一个示例 shared.conf:
default_type text/plain;
return 200 "http_user_agent: $http_user_agent
remote_addr: $remote_addr
remote_port: $remote_port
scheme: $scheme
nginx_version: $nginx_version
";
正则表达式和包含文件都是很好的方法,我经常使用它们。但另一种选择是使用 "named location",这在许多情况下都是一种有用的方法,尤其是在更复杂的情况下。 official "If is Evil" page 基本上显示了以下作为做事的好方法:
error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}
这些不同的方法各有利弊。正则表达式的一大优点是您可以捕获部分匹配项并使用它们来修改响应。当然,您通常可以通过在原始块中设置变量或使用 map
. The downside of the regex approach is that it can get unwieldy if you want to match a variety of locations, plus the low precedence of a regex 来使用其他方法获得类似的结果,但可能不适合您想要匹配位置的方式——更不用说明显的性能影响了在某些情况下来自正则表达式。
包含文件的主要优点(据我所知)是它可以更加灵活地确定您可以包含的内容——例如,它不必是一个完整的位置块。但它在主观上也比命名位置笨拙一些。
另请注意,您可以在类似情况下使用一个相关的解决方案:嵌套位置。这个想法是,您将从一个非常通用的位置开始,对几个可能的匹配项应用一些通用的配置,然后为您要匹配的不同类型的路径设置单独的嵌套位置。例如,这样做可能很有用:
location /specialpages/ {
# some config
location /specialpages/static/ {
try_files $uri $uri/ =404;
}
location /specialpages/dynamic/ {
proxy_pass http://127.0.0.1;
}
}
这是一种简短但有效且经过验证的方法:
location ~ (patternOne|patternTwo){ #rules etc. }
因此,可以轻松地使用指向相同位置块/规则的简单管道语法来拥有多个模式。
如何在 NGINX 配置中为两个位置设置相同的规则?
我试过以下方法
server {
location /first/location/ | /second/location/ {
..
..
}
}
但是 nginx 重新加载抛出了这个错误:
nginx: [emerg] invalid number of arguments in "location" directive**
尝试
location ~ ^/(first/location|second/location)/ {
...
}
~
表示对url使用正则表达式。 ^
表示从第一个字符开始检查。这将查找 /
后跟任一位置,然后是另一个 /
.
另一种选择是使用包含文件在两个前缀位置重复规则。由于前缀位置在配置中与位置无关,因此使用它们可以在您稍后添加其他正则表达式位置时避免一些混乱。尽可能避免使用正则表达式位置将有助于您的配置顺利扩展。
server {
location /first/location/ {
include shared.conf;
}
location /second/location/ {
include shared.conf;
}
}
这是一个示例 shared.conf:
default_type text/plain;
return 200 "http_user_agent: $http_user_agent
remote_addr: $remote_addr
remote_port: $remote_port
scheme: $scheme
nginx_version: $nginx_version
";
正则表达式和包含文件都是很好的方法,我经常使用它们。但另一种选择是使用 "named location",这在许多情况下都是一种有用的方法,尤其是在更复杂的情况下。 official "If is Evil" page 基本上显示了以下作为做事的好方法:
error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}
这些不同的方法各有利弊。正则表达式的一大优点是您可以捕获部分匹配项并使用它们来修改响应。当然,您通常可以通过在原始块中设置变量或使用 map
. The downside of the regex approach is that it can get unwieldy if you want to match a variety of locations, plus the low precedence of a regex 来使用其他方法获得类似的结果,但可能不适合您想要匹配位置的方式——更不用说明显的性能影响了在某些情况下来自正则表达式。
包含文件的主要优点(据我所知)是它可以更加灵活地确定您可以包含的内容——例如,它不必是一个完整的位置块。但它在主观上也比命名位置笨拙一些。
另请注意,您可以在类似情况下使用一个相关的解决方案:嵌套位置。这个想法是,您将从一个非常通用的位置开始,对几个可能的匹配项应用一些通用的配置,然后为您要匹配的不同类型的路径设置单独的嵌套位置。例如,这样做可能很有用:
location /specialpages/ {
# some config
location /specialpages/static/ {
try_files $uri $uri/ =404;
}
location /specialpages/dynamic/ {
proxy_pass http://127.0.0.1;
}
}
这是一种简短但有效且经过验证的方法:
location ~ (patternOne|patternTwo){ #rules etc. }
因此,可以轻松地使用指向相同位置块/规则的简单管道语法来拥有多个模式。