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

问题描述 投票:0回答:5

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

我尝试过以下方法

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

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

nginx: [emerg] invalid number of arguments in "location" directive**
nginx nginx-location
5个回答
381
投票

尝试

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

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

正则表达式前面带有波形符 (~) 进行区分大小写的匹配,或波形符星号 (~*) 进行不区分大小写的匹配。


131
投票

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

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

这是一个共享.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
";

71
投票

正则表达式和包含文件都是很好的方法,我经常使用它们。但另一种选择是使用“命名位置”,这在许多情况下都是一种有用的方法,尤其是在更复杂的情况下。 官方“如果是邪恶的”页面基本上显示了以下作为做事的好方法:

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



16
投票

location ~ (patternOne|patternTwo) { #rules etc. }

因此,可以使用指向相同位置块/规则的简单管道语法轻松拥有多种模式。


0
投票

upstream nextjs-fp { server nextjs-frontend:3000; } server { listen 80; location ~* .(_next|profile|orders)$ { proxy_pass http://nextjs-fp; } }

© www.soinside.com 2019 - 2024. All rights reserved.