reescritura de mayúsculas y minúsculas nginx

15

Estoy tratando de hacer que mis redirecciones nginx sean lo más limpias posible. Entiendo que ~ * es para mayúsculas y minúsculas, pero solo puedo hacer que funcione en el ejemplo 2.

Ejemplo 1

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

Ejemplo 2: esto funciona, pero no es tan eficiente como la línea anterior.

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

¿Hay alguna manera de hacer redirecciones que no distingan entre mayúsculas y minúsculas con el ejemplo 1 sin que quede demasiado turbio?

Gracias.

milleruni
fuente

Respuestas:

10

Acabo de tener (y solucioné) este mismo problema y terminé aquí tratando de encontrar la respuesta. La documentación de nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) no establece claramente que el ~ * solo funciona dentro de una declaración if, pero aparentemente, ese es el caso.

Para obtener una coincidencia de expresión regular que no distinga entre mayúsculas y minúsculas para una reescritura de URL de ngnix fuera de una instrucción if, tuve que usar el estilo Apache / Perl:

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

Ver http://perldoc.perl.org/perlretut.html (buscar insensible). También parece que el prefijo (? I) fuera de un grupo de captura específico hace que se aplique a toda la cadena de búsqueda. Nota: Esto NO parece funcionar con "^ (? I) foobar" porque parece que "^" está implícito.

Sin embargo, solo para estar seguro y para hacer que cualquier reescritura futura sea más fácil de mantener y menos ambigua si termina haciendo un montón de ellas, es posible que desee hacer algo como esto:

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

Espero que esto ayude...

AbogadoEnLinux
fuente
30

Lo que he encontrado para que esto funcione:

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

Solo necesitas hacer esto:

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

Esto solo significa anteponer (? I) y de lo contrario todo es igual para la coincidencia.

ogrrd
fuente
44
Esta debería ser la respuesta aceptada.
thekingoftruth
2
Gracias. Tan simple y tan difícil de encontrar en los documentos de Nginx. ¡Aprecio mucho el puntero conciso!
PKHunter
0

Trabajando en un sitio web en este momento, descubrí que esto también parece funcionar. Para cualquier persona en la misma situación en la que estuve estas últimas horas.

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