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;
- ✅ Rápido — envía la respuesta HTTP directamente, sin motor de regex involucrado
- ✅ Sintaxis simple, difícil de equivocarse
- ✅ Recomendación oficial para la mayoría de los casos de redirección
- ❌ No puede capturar y reutilizar segmentos de URL
rewrite (potente pero más lento)
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
- ✅ Soporta grupos de captura con regex
- ✅ Puede transformar la estructura de la URL
- ❌ Más lento que
return - ❌ Sintaxis compleja, fácil de crear bucles infinitos
💡 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
- Prefiere
returnsobrerewrite— sin sobrecarga del motor de regex - Simplifica las cadenas de redirección: redirige directamente de A a C, no A → B → C
- Usa
mappara tablas grandes de redirección — se evalúa al cargar la configuración, no por solicitud - Evita regex innecesarias en bloques
location; usa coincidencias de prefijo o exactas cuando sea posible - Siempre ejecuta
nginx -tdespués de los cambios para detectar errores de sintaxis antes de recargar
Después de configurar las redirecciones, verifícalas con 301check.com.