Cuando configuras un sitio web con Nginx, una de las primeras cosas que necesitas resolver es si quieres que tu dominio sea accesible con o sin el prefijo www. Más importante aún, necesitas decidir una versión canónica y redirigir todo lo demás hacia ella. Esto es clave para el SEO y para evitar contenido duplicado.
Muchos caen en la tentación de usar rewrite para esto, pero yo prefiero una solución más directa y eficiente. Nginx nos da la opción de usar return, que es mucho más performante para este tipo de redirecciones.
¿Por qué return 301 y no rewrite?
La diferencia es simple pero crucial. Cuando Nginx encuentra un return, detiene inmediatamente el procesamiento de la solicitud y envía la respuesta al cliente. En cambio, con un rewrite, el servidor sigue procesando el resto del bloque location o server, buscando más reglas que aplicar.
Esto significa que return es directamente más rápido y consume menos recursos. Para una redirección tan básica como esta, no necesitas más complejidad. A veces me frustra ver sobreingeniería en cosas que tienen una solución tan simple.
Redirigir de www a no-www
Si tu preferencia es tener la versión sin www (por ejemplo, tusitio.cl), necesitas un bloque server que capture las solicitudes a www.tusitio.cl y las redirija.
Ojo que la variable $scheme es super útil aquí, porque maneja automáticamente si la conexión es HTTP o HTTPS. Así no tienes que preocuparte de escribir dos reglas distintas.
server {
listen 80;
listen 443 ssl;
server_name www.tusitio.cl;
# Asegúrate de configurar tus certificados SSL para este bloque también
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
return 301 $scheme://tusitio.cl$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name tusitio.cl;
# Aquí va el resto de la configuración de tu sitio principal
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
location / {
# Por ejemplo, un proxy a tu aplicación Node.js o PHP-FPM
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Con esta configuración, cualquier solicitud a http://www.tusitio.cl/pagina o https://www.tusitio.cl/pagina será redirigida permanentemente (código 301) a http://tusitio.cl/pagina o https://tusitio.cl/pagina, respectivamente.
Redirigir de no-www a www
Si tu preferencia es tener la versión con www (por ejemplo, www.tusitio.cl), la lógica es exactamente la inversa. Necesitas un bloque server que capture las solicitudes a tusitio.cl y las redirija a www.tusitio.cl.
server {
listen 80;
listen 443 ssl;
server_name tusitio.cl;
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
return 301 $scheme://www.tusitio.cl$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name www.tusitio.cl;
# Aquí va el resto de la configuración de tu sitio principal
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Aquí, http://tusitio.cl/blog o https://tusitio.cl/blog irán a http://www.tusitio.cl/blog o https://www.tusitio.cl/blog. Sencillo y efectivo.
Consideraciones adicionales
- DNS: Asegúrate de que tus registros DNS (A o CNAME) apunten tanto para
tusitio.clcomo parawww.tusitio.cla la IP correcta de tu servidor Nginx. Si no, Nginx nunca recibirá la solicitud para redirigir. - Certificados SSL: Si usas HTTPS, los certificados deben ser válidos para ambos dominios (
tusitio.clywww.tusitio.cl). Un certificado wildcard (*.tusitio.cl) o un certificado con ambos nombres en el SAN (Subject Alternative Name) sirve. - Puerto 80: Mantener el
listen 80es importante. Si alguien tecleahttp://tusitio.cl, quieres que igual lo redirija a la versión canónica, y quizás directamente a HTTPS si esa es tu política (algo que yo siempre recomiendo).
Mi recomendación
Si me preguntas qué haría yo, siempre iría por la versión sin www y con HTTPS obligatorio. Es más limpio, más corto y hoy en día, el SSL ya no es un extra, es un estándar.
Así que mi configuración preferida siempre empieza con un bloque que redirige todo a https://tusitio.cl. Eso incluye HTTP a HTTPS, y www a no-www.
server {
listen 80;
server_name tusitio.cl www.tusitio.cl;
return 301 https://tusitio.cl$request_uri;
}
server {
listen 443 ssl;
server_name www.tusitio.cl;
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
return 301 https://tusitio.cl$request_uri;
}
server {
listen 443 ssl;
server_name tusitio.cl;
ssl_certificate /etc/nginx/ssl/tusitio.cl.crt;
ssl_certificate_key /etc/nginx/ssl/tusitio.cl.key;
# Aquí va la configuración real de tu aplicación
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Esta es la configuración más robusta y simple para asegurar que tu sitio siempre se muestre de la forma que quieres, priorizando seguridad y rendimiento. Nada de vueltas, directo a lo que funciona.