riscrittura insensibile al maiuscolo / minuscolo di nginx


15

Sto cercando di rendere i miei reindirizzamenti nginx il più puliti possibile. Capisco ~ * non è sensibile al maiuscolo / minuscolo, ma posso farlo funzionare solo nell'esempio 2.

Esempio 1

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

Esempio 2 - Funziona, ma non è efficiente come sopra.

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

Esiste un modo per eseguire reindirizzamenti senza distinzione tra maiuscole e minuscole con l'esempio 1 senza renderlo troppo fangoso?

Grazie.

Risposte:


10

Ho appena avuto (e risolto) lo stesso problema e sono finito qui cercando di trovare la risposta. La documentazione di nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ), non afferma chiaramente che ~ * funziona solo all'interno di un'istruzione if, ma a quanto pare, è il caso.

Per ottenere la corrispondenza delle espressioni regolari senza distinzione tra maiuscole e minuscole per la riscrittura di un URL ngnix al di fuori di un'istruzione if, ho dovuto usare lo stile Apache / Perl:

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

Vedi http://perldoc.perl.org/perlretut.html (cerca insensibile). Sembra anche che il prefisso (? I) al di fuori di uno specifico gruppo di acquisizione lo applichi all'intera stringa di ricerca. Nota: questo NON sembra funzionare con "^ (? I) foobar" perché sembra che "^" sia implicito.

Solo per essere sicuro, però, e per rendere eventuali future riscritture più facili da mantenere e meno ambigue se finisci per farne un mucchio, potresti voler fare qualcosa del genere:

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

Spero che sia di aiuto...


30

Cosa ho trovato per farlo funzionare:

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

Devi solo fare questo:

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

Questo significa solo anteporre (? I) e altrimenti tutto è uguale per la corrispondenza.


4
Questa dovrebbe essere la risposta accettata.
thekingoftruth,

2
Grazie. Così semplice, eppure così difficile da trovare nei documenti di Nginx. Molto apprezzato il puntatore conciso!
PKHunter

1

Lavorando su un sito web in questo momento ho scoperto che anche questo sembra funzionare. Per tutte le persone nella stessa situazione ero in queste ultime ore.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.