web-dev-qa-db-ja.com

nginxの大文字と小文字を区別しない書き換え

私は私のnginxリダイレクトをできるだけきれいにしようとしています。 〜*は大文字と小文字を区別しないことを理解していますが、例2でしか機能しません。

例1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

例2-これは機能しますが、上記の行ほど効率的ではありません。

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }

例1を使用して、大文字と小文字を区別せずに、あまり泥だらけにせずにリダイレクトを行う方法はありますか?

ありがとう。

15
milleruni

私はちょうど同じ問題を抱えていて(そして修正しました)、結局ここで答えを見つけようとしました。 nginxのドキュメント( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html )は、〜*がifステートメント内でのみ機能することを明確に述べていませんが、明らかにケース。

Ifステートメントの外でngnix URL書き換えの大文字と小文字を区別しない正規表現マッチングを取得するには、Apache/Perlスタイルを使用する必要がありました。

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

http://perldoc.Perl.org/perlretut.html (insensitiveを検索)を参照してください。また、特定のキャプチャグループの外側にプレフィックス(?i)を付けると、検索文字列全体に適用されるようになります。注:これは「^(?i)foobar」では機能しないようです。これは、「^」が暗示されているためです。

ただし、念のために説明します。また、将来的に書き換えを保守しやすくし、大量の書き込みを行う場合に曖昧さをなくすために、次のようにすることをお勧めします。

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}

お役に立てれば...

10
LawyerOnLinux

これを機能させるために私が見つけたもの:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

これを行う必要があるだけです:

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

これは単に先頭に追加する(?i)ことを意味します。それ以外の場合は、マッチングのすべてが同じです。

31
ogrrd

今ウェブサイトで作業しているところ、これも機能しているようです。同じ状況にいるすべての人にとって、私はここ数時間でした。

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_Host/whatever/foobar redirect;
}
1
Pocketninja