Answers:
尝试
location ~ ^/(first/location|second/location)/ {
...
}
该~
方法使用正则表达式的URL。^
从第一个字符开始检查的方法。这将寻找一个/
位置,然后是另一个位置,然后是另一个位置/
。
nginx/1.13.2
proxy_pass
工作,请参见以下答案:stackoverflow.com/a/46625656/1246870
另一种选择是使用包含的文件在两个前缀位置重复规则。由于前缀位置在配置中与位置无关,因此在以后添加其他正则表达式位置时,使用前缀位置可以避免一些混乱。尽量避免使用正则表达式,这将有助于您的配置顺利扩展。
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
";
shared.conf
示例和位置吗?
正则表达式和包含文件都是好的方法,我经常使用它们。但是另一种选择是使用“命名位置”,这在许多情况下都是有用的方法,尤其是在更复杂的情况下。该官方“如果是邪恶的”页面显示实质上包含以下一种好方法做的事情:
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;
}
}