我在理解nginx中的嵌套位置时遇到了麻烦。我在两个位置有一些共同的配置指令,所以与其重复这些指令,不如使用正则表达式重复URI:

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


但是,这会产生错误

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


如果没有or |,这似乎还可以。

location ~ /a {
        location /a {
        }
}


什么我做错了吗?有没有更好的方法可以执行此操作而无需重复任何操作?我可以用其他方式对位置进行分组吗?

评论

为什么要分组?为什么不只是KISS?

forum.nginx.org/read.php?2,174517,174534#msg-174534

因为在逻辑上它们是分组的

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

#1 楼

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

您只能在父位置也是前缀位置时定义嵌套前缀位置:

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年9月10日,下午1:33

第一句话应该在文档中。

– AndreKR
15年4月15日在7:13

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

– Meekohi
17年5月15日在20:46

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

– Meekohi
17年5月15日在20:52

父位置可以是非正则表达式位置,但是父内部的任何多个嵌套位置都必须是正则表达式/非正则表达式。

– MitchellK
18年6月26日在7:45