嵌套的 Nginx 位置(正则表达式块中的前缀块)不起作用

嵌套的 Nginx 位置(正则表达式块中的前缀块)不起作用

我无法理解 nginx 中的嵌套位置。我有两个位置有一些共同的配置指令,因此我宁愿使用正则表达式重复 URI,而不是重复指令:

location ~ /a|/b {
        location /a {
        }
        location /b {
        }
}

然而,这给出了错误

nginx: [emerg] location "/a" is outside location "/a|/b" in /etc/nginx/nginx.conf:36

但是,没有或|似乎还好。

location ~ /a {
        location /a {
        }
}

我做错了什么?有没有更好的方法可以做到这一点而不重复任何事情?我可以用另一种方式对位置进行分组吗?

答案1

老问题,但问题是因为父位置是正则表达式位置,而嵌套位置是前缀位置。

当父位置由正则表达式定义时,任何嵌套位置也必须由正则表达式定义:

location ~ ^/(a|b) {
        location ~ ^/a {
        ...
        }
        location ~ ^/b {
        ...
        }
}

仅当父位置也是前缀位置时,您才可以定义嵌套的前缀位置:

location /a {
        location /a {
               # You can also skip this location and just write
               # your code directly under the parent location
        }
        location /a/b {
        ...
        }
}

但是,当父位置是前缀位置时,您可以定义嵌套的正则表达式位置:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

相关内容