Redirecciones Nginx 301 y 302 en un VPS Linux

3 min
Hosting VPS/VDS

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 nginx o sudo dnf install nginx).
  • Un nombre de dominio (example.com) cuyos registros DNS A/AAAA apunten a VPS_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.

Nginx
location = /old-page { return 301 /new-page; }

Usa rewrite solo cuando necesites capturar parte de la URL con una expresión regular:

Nginx
rewrite ^/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):

Nginx
1server { 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:

Nginx
1server { 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:

Nginx
location = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }

Para una carpeta entera movida conservando las subrutas:

Nginx
location /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }

🏠 Redirigir un dominio completo

Cuando abandonas old-example.com por example.com, conserva todas las rutas:

Nginx
1server { 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.

Bash
sudo nginx -t sudo systemctl reload nginx

Después comprueba las cabeceras sin seguir la redirección:

Bash
curl -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.

Mantente al día con las últimas ofertas, descuentos y promociones especiales.

Ver promociones

Utilizamos cookies

Utilizamos cookies analíticas para mejorar su experiencia en nuestro sitio. No vendemos datos a terceros. Más información en nuestra política de privacidad.