Guía de configuración de redirecciones en Nginx

Contenido

Nginx es uno de los servidores web más utilizados, y la configuración de redirecciones es una tarea rutinaria al administrarlo. Las dos herramientas principales — return y rewrite — a menudo se confunden, lo que lleva a configuraciones ineficientes o rotas.

return vs rewrite

return (recomendado)

return 301 https://example.com;

rewrite (potente pero más lento)

rewrite ^/old-path/(.*)$ /new-path/$1 permanent;

💡 Regla general

Usa return siempre que sea posible. Solo recurre a rewrite cuando necesites grupos de captura con regex o transformaciones complejas de URL.

Ejemplos básicos

Redirección 301 permanente

server {
    listen 80;
    server_name old-domain.com;
    return 301 https://new-domain.com$request_uri;
}

Redirección 302 temporal

server {
    listen 80;
    server_name example.com;
    location /maintenance {
        return 302 /maintenance.html;
    }
}

Redirección de una sola página

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

HTTP a HTTPS

Recomendado: bloques server separados

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    # configuración del sitio...
}

⚠️ Evita la directiva if

La comunidad de Nginx tiene un dicho: "if es malvado". La directiva if puede causar comportamientos inesperados en ciertos contextos. Usa bloques server separados para las redirecciones HTTPS.

Canonicalización www

sin www → www

server {
    listen 80;
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    return 301 https://www.example.com$request_uri;
}

www → sin www

server {
    listen 80;
    listen 443 ssl http2;
    server_name www.example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    return 301 https://example.com$request_uri;
}

Redirecciones de ruta

# Redirigir un directorio, eliminando el prefijo
location /blog/ {
    rewrite ^/blog/(.*)$ /articles/$1 permanent;
}

# Redirecciones masivas con map (eficiente para listas grandes)
map $uri $new_uri {
    /old-page-1 /new-page-1;
    /old-page-2 /new-page-2;
}
server {
    if ($new_uri) { return 301 $new_uri; }
}

Redirecciones con regex

# Eliminar extensión .html
location ~ ^(.+)\.html$ {
    return 301 $1;
}

# Eliminar prefijo de URL basado en fecha
location ~ ^/\d{4}/\d{2}/\d{2}/(.+)$ {
    return 301 /$1;
}

Errores comunes

1. Bucle de rewrite

# ❌ Bucle infinito
location /old/ {
    rewrite ^/old/(.*)$ /new/$1;
}

# ✅ Usa el flag permanent o return
location /old/ {
    return 301 /new$request_uri;
}

2. Pérdida de query strings

# ❌ Se pierde el query string
location /old { return 301 /new; }

# ✅ Preservar el query string
location /old { return 301 /new$is_args$args; }

3. Falta de configuración SSL en el destino HTTPS

Si rediriges HTTP → HTTPS pero no has configurado el bloque server HTTPS con un certificado válido, los usuarios verán un error de conexión. Siempre verifica que el bloque HTTPS exista y que el certificado sea válido antes de activar la redirección.

Consejos de rendimiento

Después de configurar las redirecciones, verifícalas con 301check.com.