Nginx reescribe el dominio sin prefijo www a dominio con prefijo www
-
06-07-2019 - |
Pregunta
Veo que Nginx La documentación de HttpRewriteModule tiene un ejemplo para reescribir un dominio con prefijo www a dominio con prefijo www:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}
¿Cómo puedo hacer lo contrario: reescribir un dominio sin prefijo www en un dominio con prefijo www? Pensé que tal vez podría hacer algo como lo siguiente, pero a Nginx no le gusta la declaración anidada if.
if ($host !~* ^www\.) { # check if host doesn't start with www.
if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain)
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
}
También quería que esto funcionara para cualquier nombre de dominio sin decirle explícitamente a Nginx que reescribiera domain1.com - > www.dominio1.com, dominio2.com - > www.dominio2.com, etc. ya que tengo una gran cantidad de dominios para reescribir.
Solución 3
Bueno, supongo que realmente no necesito el exterior "si" declaración ya que solo estoy buscando dominios del formulario xxx.xxx de todos modos. Lo siguiente funciona para mí, aunque no es robusto. Avíseme si hay una mejor solución.
if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
Editar: guión agregado a la expresión regular ya que es un carácter válido en un nombre de host.
Otros consejos
Como se indica en la documentación de Nginx, debe evitar el uso de < directiva code> if en Nginx donde sea posible , porque tan pronto como tenga un if
en su configuración, su servidor necesita evaluar cada solicitud para decidir si coincide con esa < código> si o no.
Una solución mejor sería múltiples directivas de servidor.
server {
listen 80;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
server_name www.website.com;
...
}
Si intenta publicar un sitio habilitado para SSL (HTTPS), tiene más o menos tres opciones diferentes.
- Configure múltiples direcciones IP haciendo que cada directiva del servidor escuche en su propia IP (o en diferentes puertos si esa es una opción para usted). Esta opción necesita certificados SSL para website.com y www.website.com , por lo que tiene un certificado comodín, un certificado UNI (múltiples dominios) o simplemente dos certificados diferentes.
- Reescribe en la aplicación.
- Use la temida directiva
if
.
if ($host !~* ^www\.) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
rewrite ^(.*)$ http://www.$host$1 permanent;
}
Solo es posible obtener nombres de host válidos porque de lo contrario la solicitud nunca llegará a su servidor, por lo que no es necesario construir su propia lógica de validación.
La documentación de nginx advierte contra el uso de if para reescribir. Consulte el enlace aquí: http://wiki.nginx.org/Pitfalls#Server_Name
HTTP & amp; HTTPS sin condiciones si:
server {
listen 80;
listen 443;
server_name website.com;
return 301 $scheme://www.website.com$request_uri;
}
server {
listen 80;
listen 443 default_server ssl;
server_name www.website.com;
# Your config goes here #
}