Я пытаюсь сделать мои перенаправления 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, не делая его слишком грязным?
Спасибо.
Что я нашел, чтобы заставить эту работу работать:
rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Вам нужно только это сделать:
rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
Это просто означает добавление (? I), в остальном все то же самое для сопоставления.
У меня была (и исправлена) та же проблема, и я оказался здесь, пытаясь найти ответ. Документация 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;
}
Надеюсь это поможет...
Работая сейчас над веб-сайтом, я обнаружил, что это работает очень просто. В блоке сервера вам просто нужно добавить записи местоположения в следующем порядке:
#This rule processes the lowercase page request.
#The (~) after the location tag specifies it is case sensitive
# so it overrides the next rule, which would continuously redirect
location ~ /index[.]html {
#process the index.html page
}
#This rules rewrites the index request which may be non-case-sensitive
# to all lowercase so the previous rule can process it.
location ~* /index[.]html {
rewrite ^(.*)$ $scheme://$http_host/index.html redirect;
}