ネストされた場所nginx


60

nginxのネストされた場所を理解するのに問題があります。いくつかの構成ディレクティブが共通する2つの場所があるため、ディレクティブを繰り返すのではなく、正規表現を使用して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

これを理解するには長い時間がかかりましたが、最終的には、場所の選択方法の単純な(優先度の高いリストを作成することができました
artfulrobot

回答:


101

古い質問ですが、問題は、親の場所が正規表現の場所であり、ネストされた場所がプレフィックスの場所であるためです。

親ロケーションがプレフィックスロケーションでもある場合、ネストされたプレフィックスロケーションのみを定義できます。

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がエラーをスローすると思いますか?
ジェイエン14

13
その最初の文はドキュメントにあるべきです。
AndreKR

1
最初の例では、location /a { }定型文を省略した場合、順序は重要ですか?
ミーコヒ

2
ああ、私が誤解したことは決してありません。ネストされた場所は、親の場所から何も継承しません。
ミーコヒ

親の場所は非正規表現の場所にすることができますが、親内の複数のネストされた場所はすべて正規表現/非正規表現のいずれかでなければなりません。
ミッチェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.