Nginx case insensitive umschreiben

15

Ich versuche, meine Nginx-Weiterleitungen so sauber wie möglich zu gestalten. Ich verstehe, dass ~ * die Groß- und Kleinschreibung nicht berücksichtigt, aber ich kann es nur in Beispiel 2 zum Laufen bringen.

Beispiel 1

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

Beispiel 2 - Dies funktioniert, ist aber nicht so effizient wie die obige Zeile.

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

Gibt es eine Möglichkeit, bei Beispiel 1 Weiterleitungen ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, ohne dass dies zu schlammig wird?

Vielen Dank.

milleruni
quelle

Antworten:

10

Ich hatte gerade das gleiche Problem (und habe es behoben) und bin hier gelandet, um die Antwort zu finden. Die nginx-Dokumentation ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) besagt nicht eindeutig, dass ~ * nur innerhalb einer if-Anweisung funktioniert, aber anscheinend ist dies der Fall.

Um eine Übereinstimmung zwischen regulären Ausdrücken ohne Berücksichtigung der Groß- und Kleinschreibung für eine ngnix-URL zu erhalten, die außerhalb einer if-Anweisung neu geschrieben wurde, musste ich den Apache / Perl-Stil verwenden:

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

Siehe http://perldoc.perl.org/perlretut.html (Suche nach Insensitive). Es scheint auch, dass das Präfix (? I) außerhalb einer bestimmten Erfassungsgruppe auf die gesamte Suchzeichenfolge angewendet wird. Hinweis: Dies scheint NICHT mit "^ (? I) foobar" zu funktionieren, da anscheinend das "^" impliziert ist.

Um jedoch sicher zu gehen und zukünftige Umschreibungen einfacher zu verwalten und weniger zweideutig zu machen, wenn Sie am Ende einige davon ausführen, möchten Sie möglicherweise Folgendes tun:

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

Hoffe das hilft...

LawyerOnLinux
quelle
29

Was ich gefunden habe, um diese Arbeit zu machen:

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

Sie müssen nur Folgendes tun:

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

Dies bedeutet nur, dass Sie (? I) voranstellen, und ansonsten ist beim Matching alles gleich.

ogrrd
quelle
4
Dies sollte die akzeptierte Antwort sein.
Thekingoftruth
2
Vielen Dank. So einfach und doch so schwer in Nginx-Dokumenten zu finden. Schätzen Sie viel den prägnanten Zeiger!
PKHunter