réécriture insensible à la casse nginx

15

J'essaie de rendre mes redirections nginx aussi propres que possible. Je comprends que ~ * est insensible à la casse, mais je ne peux que le faire fonctionner dans l'exemple 2.

Exemple 1

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

Exemple 2 - Cela fonctionne, mais ce n'est pas aussi efficace que la ligne ci-dessus.

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

Existe-t-il un moyen de faire des redirections insensibles à la casse avec l'exemple 1 sans le rendre trop boueux?

Merci.

milleruni
la source

Réponses:

10

J'ai juste eu (et corrigé) ce même problème et j'ai fini par essayer de trouver la réponse. La documentation nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) n'indique pas clairement que le ~ * ne fonctionne qu'à l'intérieur d'une instruction if, mais apparemment, c'est le cas.

Pour obtenir une expression régulière insensible à la casse pour une réécriture d'URL ngnix en dehors d'une instruction if, j'ai dû utiliser le style Apache / Perl:

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

Voir http://perldoc.perl.org/perlretut.html (rechercher insensible). Il semble également que le préfixe (? I) en dehors d'un groupe de capture spécifique le fasse s'appliquer à la chaîne de recherche entière. Remarque: Cela ne semble PAS fonctionner avec "^ (? I) foobar" car il semble que le "^" soit implicite.

Juste pour être sûr, cependant, et pour rendre toute réécriture future plus facile à maintenir et moins ambiguë si vous finissez par en faire un tas, vous voudrez peut-être faire quelque chose comme ceci:

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

J'espère que cela t'aides...

LawyerOnLinux
la source
30

Ce que j'ai trouvé pour que cela fonctionne:

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

Il vous suffit de faire ceci:

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

Cela signifie simplement le préfixe (? I) et sinon tout est identique pour l'appariement.

ogrrd
la source
4
Cela devrait être la réponse acceptée.
thekingoftruth
2
Je vous remercie. Si simple et pourtant si difficile à trouver dans les documents Nginx. J'apprécie beaucoup le pointeur concis!
PKHunter
1

En travaillant sur un site Web en ce moment, j'ai trouvé que cela semblait aussi fonctionner. Pour toutes les personnes dans la même situation, j'étais dans ces dernières heures.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Pocketninja
la source