如何在NGINX配置中对两个位置有相同的规则?

如何在NGINX配置中对两个位置有相同的规则?

我尝试过以下方法

server {
location /first/location/ | /second/location/ {
..
..
}
}

但是nginx重载抛出了这个错误:

nginx: [emerg] invalid number of arguments in "location" directive**
199503 次浏览

试一试

location ~ ^/(first/location|second/location)/ {
...
}

~表示对url使用正则表达式。^表示从第一个字符开始检查。这将查找一个/,后面跟着任意一个位置,然后是另一个/

另一种选择是使用包含的文件在两个前缀位置重复规则。由于前缀位置在配置中是独立于位置的,因此在稍后添加其他regex位置时,使用它们可以避免一些混乱。尽可能避免regex位置将有助于您的配置顺利扩展。

server {
location /first/location/ {
include shared.conf;
}
location /second/location/ {
include shared.conf;
}
}

下面是一个share .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
";

regex和包含的文件都是很好的方法,我经常使用它们。但另一种替代方法是使用“命名位置”,这在许多情况下是一种有用的方法——尤其是更复杂的情况。官方“If is Evil”页面本质上显示了以下操作的好方法:

error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}

这些不同的方法各有利弊。正则表达式的一大优点是可以捕获部分匹配并使用它们修改响应。当然,通过在原始块中设置变量或使用map,通常可以用其他方法实现类似的结果。正则表达式方法的缺点是,如果你想匹配各种不同的位置,它可能会变得笨拙,加上正则表达式的低优先级可能不适合你想要匹配位置的方式——更不用说正则表达式在某些情况下会明显影响性能。

包含文件的主要优势(据我所知)是它在包含内容方面更加灵活——例如,它不必是一个完整的位置块。但从主观上讲,它也比命名位置要笨拙一些。

还要注意,在类似的情况下,您可能会使用一个相关的解决方案:嵌套位置。其思想是,您将从一个非常通用的位置开始,对几个可能的匹配应用一些公共配置,然后为想要匹配的不同类型的路径设置单独的嵌套位置。例如,这样做可能会很有用:

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. }

因此,可以很容易地使用简单的管道语法让多个模式指向相同的位置块/规则。

这对我很有效

upstream nextjs-fp {
server  nextjs-frontend:3000;
}


server {
listen 80;
  

location ~* .(_next|profile|orders)$  {
proxy_pass http://nextjs-fp;
}
  

}