web-dev-qa-db-ja.com

正規表現リダイレクトからディレクトリを除外する

下線付きのすべてのURLを同等の破線にリダイレクトしたいと思います。

例えば。 /nederland/amsterdam/car_rental/nederland/amsterdam/car-rentalになります。このために、ここで説明されている手法を使用しています: アンダースコアをダッシュ​​に置き換えてNginxで置き換える方法 。したがって、私のロケーションブロックは以下に一致します:

location ~ (_) 

しかし、私はonlyをURLで実行したいnotin /adminネームスペース。これを達成するために、私は正規表現をネガティブルックアップと組み合わせてみました: 正規表現は単語を含まない行に一致しますか? 。場所は次と一致します:

(?=^(?!\/admin))(?=([^_]*))

Rubularは、文字列/nederland/amsterdam/car_rentalが正規表現に一致すると報告しますが、/admin/stats_dashboardは、希望どおりに一致しません。しかし、このルールをnginx設定に適用すると、サイトは最終的にリダイレクトループになります。私が見落としたことはありますか?

更新:/admin名前空間の内容を実際に書き換える必要はありません。アンダースコアからダッシュへの書き換えは、/admin名前空間のすべてのURLではなくのみ行う必要があります。

19
richard

Nginxの場所の一致順序 は、正規表現を使用して定義された場所が構成ファイル内での出現順にチェックされ、正規表現の検索が最初の一致で終了するようなものです。

この知識があれば、あなたの立場で、リンクした Stack Overflow Answer から取得したアンダースコアの「admin」の正規表現を使用して1つの場所を定義します。

location ~ (\badmin\b) {
    # Config to process urls containing "admin"
}
location ~ (_) {
    # Config to process urls containing "_"
}

adminが含まれるリクエストは、アンダースコアがあるかどうかに関係なく、最初のロケーションブロックによって処理されます。これは、一致するロケーションブロックがアンダースコアの前にあるためです。

** PS **

私の投稿の数日後にcnstが投稿した別の回答として、私が投稿した位置照合順序に関するドキュメントへのリンクは、^~修飾子を使用して/adminフォルダーを照合し、スキップすることもできることを示していますアンダースコアのロケーションブロック。

私は個人的にはこの修飾子を使用しない傾向があり、注釈付きコメントと一緒に正規表現ベースの場所をバンドすることを好みますが、それは確かにオプションです。

ただし、「/ admin」で始まるリクエストは修飾子と一致し、予期しない結果になる可能性があるため、設定によっては注意が必要です。

言ったように、明確な理解なしに誰も設定ファイル内の物事の順序を勝手に変更し始めることはないので、私は正規表現ベースのアプローチが安全であることを好みます。

10
Dayo
^(?!\/admin\b).*

lookaheadでこの単純な正規表現が必要です。デモを参照してください。

https://regex101.com/r/uF4oY4/16

あなたの正規表現は失敗します/nederland/amsterdam/car_rentalもあるので_。したがって、文字列/nederland/amsterdam/carが考慮されます。

または

あなたは使うことができます

rewrite ^(?!\/admin\b)([^_]*)_(.*)$ $1-$2;
6
vks

どちらか一方を明示的に言及していませんが、/adminの接頭辞を形成し、$uri正規表現に一致する単一の^/admin.*$名前空間のみを持っている可能性があります;そのような仮定に基づいて、競合しない2つの構成オプションを提供します。


他の人が示唆したように、/adminには別の location を使用することをお勧めします。

ただし、他の回答とは異なり、プレフィックス文字列で定義し、^~修飾子を使用して、一致が成功した後の正規表現。

location ^~ /admin {
}

別の方法として、またはさらに追加して、リンクされた回答から非POSIX正規表現のように見えるものを使用する代わりに(OpenBSDで re_format(7)を読んだ場合) は信じられることです)、REが何であるかを知っていると主張し、あらゆる場所で機能すると主張するほとんどの人々によって理解されることが保証されている、はるかに単純なものを検討します。除外するのは^/admin.*パスです。

location ~ ^/[^a][^d][^m][^i][^n].*_.* {
}

目標を達成するために、これら2つのソリューションのいずれか、または両方を使用して、より厳密でフールプルーフにすることができます。

6
cnst