web-dev-qa-db-ja.com

nginxルール-1つを除くすべてのパスに一致

/ newsletter /で始まるすべてのパスを正規表現で1つ(/ newsletter/one)を除いて一致させようとしています。これまでのところ:

   location ~ ^/newsletter/(.*)$ {
// configuration here
}

これは、/ newsletter /で始まるすべてのパスに一致します。

パス/ newsletter/oneを例外にするにはどうすればよいですか?

8
dasj19

私は次の解決策を使用してしまいました:

location ~ ^/newsletter/(.*)$ {
    location ~ /newsletter/one(.*) {
           // logic here
    }
    // logic here
}

これは、/ newsletter/*の下のすべてのパスに一致し、次に/ newsletter/oneで始まるすべてのパスに一致し、残りの構成を外部構成に保持しながら、newsletter/oneの構成を内部構成ブロックに適用しますブロック。

12
dasj19

これは機能しますが、欠点が1つあります。また、「1」の後に続く文字は一致しません。

location ~ ^/newsletter/(?!one).*$ {
    //configuration here
}

しかし、これはより良いかもしれません:

location = /newsletter/one {
    // do something (not serve an index.html page)
}

location ~ ^/newsletter/.*$ {
    // do something else
}

これは、Nginxが=locationを使用してリクエストを処理します。 1つの問題は、indexページを使用している場合、リクエストが内部で書き直され、2番目のlocationに一致してそれを使用するため、これが一致しないことです。以下を参照してください: https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms#matching-location-blocks

Nginxが使用する場所を選択する方法を説明するセクションがあります。

8
varlogtim

Varlogtimの解決策を明確にするには、次のように機能します。これにより、_/newsletter/one-time_に一致させることができますが、_/newsletter/one_はスキップできます

location ~ ^/newsletter/(?!one$).*$

また、一致で大文字と小文字を区別しない場合は、_~*_の代わりに_~_修飾子を使用します

2
cbedrosian

こちらがその1つです。

^/newsletter(/&/[^o][^n][^e])$
0
Jonas Bjork