utiliza - Nginx reescribe el dominio sin prefijo www para www-prefixed domain
redireccionar puerto 80 a 443 nginx (5)
Bueno, supongo que realmente no necesito la declaración externa "si" ya que solo estoy buscando dominios de la forma xxx.xxx. 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: se agregó guión a la expresión regular ya que es un carácter válido en un nombre de host.
Veo que la documentación Nginx HttpRewriteModule tiene un ejemplo para reescribir un dominio con prefijo www en un dominio sin 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 que no tiene prefijo www para 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 if anidada.
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.domain1.com, domain2.com -> www.domain2.com, etc. ya que tengo una gran cantidad de dominios para reescribir .
La documentación de nginx advierte contra el uso de if para reescribir. Por favor mira el enlace aquí: http://wiki.nginx.org/Pitfalls#Server_Name
Como se señala en la documentación de Nginx, debe evitar usar la directiva if
en Nginx siempre que sea posible , ya que tan pronto como tenga un if
en su configuración, su servidor debe evaluar cada solicitud para decidir si coincide o no con eso.
Una mejor solución 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 intentas servir un sitio con SSL (HTTPS), tienes más o menos tres opciones diferentes.
- Configure múltiples direcciones IP teniendo cada directiva de servidor escuchando en su propia IP (o diferentes puertos si esa es una opción para usted). Esta opción necesita certificados SSL tanto para website.com como para www.website.com , por lo tanto, usted tiene un certificado de comodín, un certificado UNI (dominios múltiples) o simplemente dos certificados diferentes.
- Haga la reescritura 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 crear su propia lógica de validación.