nginx bez rozróżniania wielkości liter


15

Staram się, aby moje przekierowania nginx były tak czyste, jak to możliwe. Rozumiem, że ~ * nie uwzględnia wielkości liter, ale mogę tylko sprawić, by zadziałał w przykładzie 2.

Przykład 1

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

Przykład 2 - To działa, ale nie jest tak wydajne jak powyższa linia.

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

Czy istnieje sposób na przekierowywanie bez rozróżniania wielkości liter w przykładzie 1 bez nadmiernego zabrudzenia?

Dzięki.

Odpowiedzi:


10

Właśnie miałem (i naprawiłem) ten sam problem i skończyłem tutaj, próbując znaleźć odpowiedź. Dokumentacja nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) nie określa wyraźnie, że ~ * działa tylko wewnątrz instrukcji if, ale najwyraźniej tak jest.

Aby dopasować wyrażenie regularne bez rozróżniania wielkości liter do przepisania adresu URL ngnix poza instrukcją if, musiałem użyć stylu Apache / Perl:

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

Zobacz http://perldoc.perl.org/perlretut.html (wyszukaj niewrażliwy). Wydaje się również, że przedrostek (? I) poza określoną grupą przechwytywania powoduje, że ma on zastosowanie do całego ciągu wyszukiwania. Uwaga: Wydaje się, że NIE działa to z foobar „^ (? I)”, ponieważ wydaje się, że implikowane jest „^”.

Jednak dla pewności i aby ułatwić przyszłe przepisywanie i zachować mniej dwuznaczności, jeśli skończysz robić ich kilka, możesz zrobić coś takiego:

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

Mam nadzieję że to pomoże...


30

Co znalazłem, aby to zadziałało:

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

Musisz to tylko zrobić:

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

Oznacza to po prostu prepend (? I), a poza tym wszystko jest takie samo dla dopasowania.


4
To powinna być zaakceptowana odpowiedź.
thekingoftruth

2
Dziękuję Ci. Tak proste, a jednocześnie tak trudne do znalezienia w dokumentach Nginx. Bardzo doceniam zwięzły wskaźnik!
PKHunter

1

Pracując teraz na stronie, wydaje mi się, że to również działa. Dla osób w tej samej sytuacji byłem w ciągu ostatnich kilku godzin.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.