嵌套位置nginx


60

我在理解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
为什么要分组?为什么不只是KISS?
pkhamre


6
因为按逻辑将它们分组
Jayen 2013年

这花了我很长时间才能理解,但最终我能够创建一个简单的(优先级优先级列表,以选择位置
artfulrobot

Answers:


100

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

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

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

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

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

我对你的第一句话感到困惑,但是你的例子很有道理。我假设在上一个示例中,前缀位置/b将引发错误?
2014年

13
第一句应该在文档中
AndreKR

1
在第一个示例中,如果您省略了location /a { }样板-顺序重要吗?
Meekohi

2
没关系,我误会了。嵌套位置不会从其父位置继承任何内容。
Meekohi

父位置可以是非正则表达式位置,但父内部的任何多个嵌套位置都必须是正则表达式/非正则表达式。
MitchellK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.