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 bloque location 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 bloque location 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