Hoy tuve la necesidad de implementar una redirección temporal en un servidor Web Nginx. Es algo bastante común cuando se hacen cambios en el diseño de un sitio Web o cuando se requiere modificar una URL y lograr que el valor anterior redirija automáticamente al nuevo.

Sin embargo, en este caso la anécdota es bastante curiosa y vale la pena contarla para entender las peripecias que debe afrontar un SysAdmin a fin de que las cosas funcionen (a pesar de los usuarios).

Resulta que tenemos un servidor Nextcloud para proveer un servicio de almacenamiento en la nube que permita trabajar de forma colaborativa a ciertas áreas de la Universidad. Un reemplazo para Google Drive digamos, ya que por razones de propiedad y seguridad de los datos preferimos que todos los datos de alumnos, docentes y trabajadores de la Universidad, queden en la Universidad (no en servidores de una empresa privada extranjera).

La cuestión es que este área (que trabaja con proveedores externos) creó una carpeta compartida para almacenar información importante que debe ser accedida públicamente por los proveedores, con la idea de compartirla a través de un enlace. El problema es que no se percataron de que, por defecto, Nextcloud aplica una caducidad de 7 días para los enlaces compartidos a través de la opción "Compartir link":

El enlace a la carpeta fue compartido en documentos PDF y correos electrónicos y, luego de 7 días, los proveedores ya no pudieron acceder más. Esto es lo que pasa cuando los usuarios finales toman determinaciones, adoptan soluciones improvisadas o utilizan sistemas para el uso que no estaban pensados o diseñados, sin consultar al área de sistemas. Los archivos deberían haber sido subidos y compartidos mediante un servidor Web, no mediante el servidor de archivos en la nube (Nextcloud).

Como el enlace caducado ya había sido compartido a través de correo electrónico, no había chance alguna de rectificarlo. Por ende, debería funcionar sí o sí. La solución que se me ocurrió para no tener que "meter mano" en las tablas de la base de datos de Nextcloud fue definir un nuevo link compartido (esta vez sin caducidad) e implementar una redirección temporal del anterior link al nuevo. Una "manganeta" como le decía un viejo y experimentado SysAdmin con el que me tocó trabajar hace algunos años.

Cómo implementar una redirección temporal (HTTP 302) en Nginx

El protocolo HTTP define varios tipos de redirecciones, principalmente las dos más utilizadas son 301 (permanente) y 302 (temporal). Más allá de que el código de respuesta 302 es "Found", significa que el recurso se encuentra temporalmente en otra locación. Es idéntico a 307 "Temporary Redirect".

¿Por qué es conveniente utilizar una redirección temporal en vez de permanente? El problema es que las redirecciones 301 son permanentes, tal como lo indica el código de respuesta. Eso significa que es prácticamente imposible de deshacer, pues una vez que un navegador ha recibido dicha respuesta, la almacena en caché por un tiempo indeterminado. Si comentemos un error al definir la redirección, estamos fritos. Las redirecciones temporales, en cambio, no se almacenan en caché e implica que en cada acceso el browser es redireccionado.

Ahora bien, cómo implementar una redirección temporal en Nginx. Lo más fácil del mundo, sólo se debe definir un simple rewrite dentro de una sección server.

# nano /usr/local/etc/nginx/nginx.conf

Supongamos que el link expirado era "https://nextcloud.linuxito.com/s/abcdef" y el nuevo (que no expira) es "https://nextcloud.linuxito.com/s/uvwxyz". La redirección entonces se implementa de la siguiente forma:

        rewrite ^/s/abcdef$ /s/uvwxyz redirect;

La palabra clave "redirect" indica que se trata de una redirección temporal. De esta forma el servidor Nginx responde HTTP 302 al acceder a "https://nextcloud.linuxito.com/s/abcdef" y redirecciona hacia "https://nextcloud.linuxito.com/s/uvwxyz".

Si se deseara implementar una redirección permanente (no recomendado), simplemente se debe cambiar "redirect" por "permanent".

Luego basta con recargar al configuración de Nginx para que tome efecto:

root@nextcloud:~ # service nginx reload
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Referencias

Compartí este artículo