7.2.2.2.5. Reescritura de direcciones¶
La reescritura de direcciones, posible gracias al módulo ngx_http_rewrite_module, posibilita modificar el recurso solicitado originalmente o, más exactamente, desviar la petición del recurso original a otro.
Nota
La documentación oficial analiza el redireccionamiento con mayor detalle que el aquí expuesto.
Hay tres directivas relacionadas con ello:
- try_files
Ya se ha visto que determina cuál es realmente el recurso que se envía al cliente. Un valor típico es:
try_files $uri $uri/ =404;
El elemento final puede ser también una localización nominal:
try_files $uri $uri/ @almacen
- return
Para el procesamiento de la petición y envía al cliente el código indicado:
location = /no.quiero.hacer.creer.que.no.existe.html { return 403; }
También es posible añadir una redirección si el código lo requiere (códigos 3XX):
server { listen 80; listen 443 ssl; server_name _; if($https != "on") { return 301 https://$host/$uri$is_args$args; } # etc. }
Para los restantes, puede añadirse una cadena que nginx añadirá al texto de la respuesta:
return 403 "Zona prohibidísima desde el exterior";
En caso de que el código de respuesta sea el 302, puede omitirse el código.
Además, la directiva error_page, ya citada, sirve:
Para enviar un determinado recurso ante un error:
error_page 404 /404.html;
Para enviar un recurso y, además, cambiar el código devuelto:
error_page 403 =404 /404.html;
- rewrite
La directiva permite hacer redirecciones complejas para lo cual presenta la siguiente sintaxis:
rewrite REGEX URL [flag]
La directiva sustituye las URLs que cumplan el patrón expresado por la expresión regular por la URL definida a continuación. Pueden capturarse grupos en la expresión regular y usarlos en la expresión de la URL posterior. Si la URL no cumple el patrón, la directiva no provoca ningún efecto. Por ejemplo, esta redirección:
rewrite ^(.+\.(?:jpe?g|png))$ /images$1 last;
modifica la ruta original añadiendo al comienzo
/images
en el caso de que se trate de una imagen. Por tanto,/foto.jpeg
se convertiría en/images/foto.jpeg
.Nota
Cuando se quiere que la expresión regular concuerde con mayúsculas o minúsuclas indistintamente, puede anteponerse al resto de la expresión (?i):
rewrite "^(?i)(.+\.(?:jpe?g|png))$" /images$1 last
En principio, tras realizar un
rewrite
, se sigue procesando la petición con la URL modificada, a menos que la URL esté completa e incluya esquema y máquina, en cuyo caso se devolverá la dirección al cliente para que realice una nueva petición. Sin embargo, la existencia de la flag opcional altera este comportamiento:Si es
last
, se parará de procesar las reescrituras restantes del bloque y se volverá a procesar la nueva URL en busca de un bloquelocation
adecuado; pero sin enviar ningún código de redirección al cliente.Si es
break
, se para el procesamiento de las reescrituras y se considera la URL obtenida como la definitiva. Por tanto, no se vuelve a procesar en busca de un nuevo bloquelocation
adecuado[1].Si es
permanent
, se realiza un redirección con código 301 (es decir, se manda una respuesta al cliente para que vuelva a realizar la petición que se indica como URL).Si es
redirect
, ocurre lo mismo pero con código 302.
Notas al pie