перезапись без учета регистра nginx

15

Я пытаюсь сделать мои перенаправления 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, не делая это слишком грязным?

Благодарю.

milleruni
источник

Ответы:

10

Я только что (и исправил) эту же проблему и оказался здесь, пытаясь найти ответ. В документации nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) четко не указано, что ~ * работает только внутри оператора if, но, очевидно, это так.

Чтобы получить регистронезависимое совпадение регулярного выражения для перезаписи URL ngnix вне оператора if, мне пришлось использовать стиль Apache / Perl:

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

См. Http://perldoc.perl.org/perlretut.html (поиск нечувствительных). Также кажется, что префикс (? I) вне определенной группы захвата делает его применимым ко всей строке поиска. Примечание: похоже, это НЕ работает с «^ (? I) foobar», потому что кажется, что подразумевается «^».

Просто чтобы быть уверенным, хотя, и чтобы любое будущее переписывание было легче поддерживать и было менее двусмысленным, если вы в конечном итоге делаете кучу из них, вы можете захотеть сделать что-то вроде этого:

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

Надеюсь это поможет...

LawyerOnLinux
источник
30

Что я нашел, чтобы сделать эту работу:

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

Вам нужно только сделать это:

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

Это просто означает prepend (? I), а в остальном все совпадает.

ogrrd
источник
4
Это должен быть принятый ответ.
thekingoftruth
2
Спасибо. Так просто, и все же так трудно найти в Nginx документах. Очень ценю лаконичный указатель!
PKHunter
1

Работая над сайтом прямо сейчас, я обнаружил, что это тоже работает. Для любых людей в такой же ситуации я был в эти последние несколько часов.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Pocketninja
источник