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.

¿Fue útil?

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.

  1. 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.
  2. Reescribe en la aplicación.
  3. Use la temida directiva if .

También hay una opción para usar SNI, pero no estoy seguro de que esto es totalmente compatible a partir de ahora .

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 #
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top