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

我尝试过以下方法

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

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

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

当前回答

这对我很有效

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

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

其他回答

Try

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

There are advantages and disadvantages to these various approaches. One big advantage to a regex is that you can capture parts of the match and use them to modify the response. Of course, you can usually achieve similar results with the other approaches by either setting a variable in the original block or using 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 might just not fit with how you want to match locations — not to mention that there are apparently performance impacts from regexes in some cases.

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

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

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