225

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

我试过以下

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

但是 nginx reload 抛出了这个错误:

nginx: [emerg] invalid number of arguments in "location" directive**
4

4 回答 4

325

尝试

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

~url 使用正则表达式的方法。^从第一个字符开始检查的方法。这将寻找 a/后跟其中一个位置,然后是另一个/

于 2016-02-12T18:18:13.393 回答
118

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

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
";
于 2016-02-13T02:56:36.900 回答
61

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

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;
    }
}
于 2017-04-24T18:31:00.010 回答
15

这是简短但有效且经过验证的方法:

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

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

于 2017-07-10T12:08:57.380 回答