Las redirecciones conservan a tus visitantes y tu posicionamiento cuando una página cambia de dirección, cuando cambias de dominio o cuando fuerzas HTTPS. Esta guía muestra cómo escribir redirecciones Nginx limpias en tu VPS Linux Infrawire y cómo probarlas antes de que lleguen a producción.
📋 Requisitos previos
- Un VPS Linux (Ubuntu 24.04 / Debian 12 o AlmaLinux 9 / Rocky 9) con acceso SSH root. La IP y la contraseña root están en tu área de cliente.
- Nginx instalado y sirviendo al menos un sitio (
sudo apt install nginxosudo dnf install nginx). - Un nombre de dominio (
example.com) cuyos registros DNS A/AAAA apunten aVPS_IP.
🧭 301 o 302: cuál elegir
- 301 (Moved Permanently): el cambio es definitivo. Los navegadores y buscadores lo guardan en caché y transfieren el posicionamiento a la nueva URL.
- 302 (Found): el cambio es temporal (mantenimiento, prueba A/B). La URL antigua sigue siendo la referencia.
En caso de duda, empieza con 302: un 301 equivocado puede quedarse mucho tiempo en la caché de los navegadores.
⚙️ return o rewrite
Prefiere return: es más rápido y legible, porque Nginx detiene el procesamiento de inmediato.
Nginxlocation = /old-page { return 301 /new-page; }
Usa rewrite solo cuando necesites capturar parte de la URL con una expresión regular:
Nginxrewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;
La bandera permanent envía un 301 y redirect envía un 302.
🌐 Redirigir www a sin www
Crea un bloque server dedicado que solo redirija. Edita /etc/nginx/sites-available/example.com (Debian/Ubuntu) o /etc/nginx/conf.d/example.com.conf (AlmaLinux/Rocky):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name www.example.com; 5 return 301 $scheme://example.com$request_uri; 6}
Para el sentido contrario, intercambia los dos nombres de host. $request_uri conserva la ruta y la query string.
🔒 Redirigir HTTP a HTTPS
Cuando el certificado esté instalado, envía todo el tráfico en claro a HTTPS:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 return 301 https://example.com$request_uri; 6} 7 8server { 9 listen 443 ssl; 10 listen [::]:443 ssl; 11 http2 on; 12 server_name www.example.com; 13 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 15 return 301 https://example.com$request_uri; 16}
El sitio real vive entonces en un tercer bloque que escucha en 443 con server_name example.com;. Ten en cuenta que http2 on; requiere Nginx 1.25.1 o superior, como en Ubuntu 24.04.
🔗 De URL antigua a URL nueva
Para pocas páginas, usa coincidencias exactas (=), las más rápidas:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
Para una carpeta entera movida conservando las subrutas:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 Redirigir un dominio completo
Cuando abandonas old-example.com por example.com, conserva todas las rutas:
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name old-example.com www.old-example.com; 5 return 301 https://example.com$request_uri; 6}
Si el dominio antiguo también tiene HTTPS, añade el bloque listen 443 ssl; correspondiente con su propio certificado; de lo contrario, los navegadores muestran un error de certificado antes de la redirección.
✅ Probar y recargar con seguridad
Valida siempre la sintaxis antes de recargar. Un reload mantiene las conexiones activas, un restart no.
Bashsudo nginx -t sudo systemctl reload nginx
Después comprueba las cabeceras sin seguir la redirección:
Bashcurl -I http://www.example.com/old-page
Salida esperada (abreviada):
HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page
Para seguir toda la cadena y ver cada salto, usa curl -IL http://www.example.com/old-page. Lo ideal es un solo salto: evita cadenas como HTTP, luego www, luego HTTPS.
🛠️ Solución de problemas
Demasiadas redirecciones (bucle). Una regla coincide con su propio destino, a menudo porque un proxy o CDN ya termina el HTTPS. Revisa la cabecera Location con curl -I y asegúrate de que el bloque de destino no vuelva a redirigir.
El cambio no tiene efecto. Editaste un archivo no activado. En Debian/Ubuntu, comprueba el enlace en /etc/nginx/sites-enabled/, luego ejecuta sudo nginx -t y sudo systemctl reload nginx. Los navegadores también cachean los 301: prueba con curl o una ventana privada.
Se pierde la query string. Con rewrite ... ? o un destino fijo, los parámetros desaparecen. Usa $request_uri en return o conserva $args de forma explícita.
Responde el bloque equivocado. Nginx elige el bloque por server_name. Lístalos con sudo nginx -T | grep server_name y busca duplicados.
🎉 Tus redirecciones están activas: permanentes cuando es definitivo, temporales cuando no, y probadas con curl antes de que tus visitantes noten nada.