¿Cómo hacer que nginx redirija de dominio www a dominio no www?

9

Digamos que quiero redirigir desde www.example.com a example.com y quiero hacer esto usando nginx. Miré a mi alrededor y no vi ninguna buena documentación sobre esto, así que pensé en preguntar y responder mi propia pregunta.

Jauder Ho
fuente

Respuestas:

7

También miré esto en la wiki de Nginx y en otros blogs, y la mejor forma de rendimiento es hacer lo siguiente:

Para redirigir de www.example.com a example.com usando nginx (versión 1.0.12 al momento de escribir).

server {
  server_name www.example.com;
  rewrite ^ $scheme://example.com$request_uri permanent; 
  # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect
  # $scheme uses http or https accordingly
}

server {
  server_name example.com;
  # the rest of your config goes here
}

Cuando las solicitudes llegan a example.com, no se utilizan declaraciones de rendimiento. Y usa $ request_uri en lugar de tener que crear una coincidencia de $ 1 que grava la reescritura (consulte la página de Errores comunes de Nginx).

Fuentes:

Demonio
fuente
En mi prueba, las directivas deben revertirse, es decir. la reescritura debe venir después del server {}bloque de configuración principal .
karmi
4

Después de investigar un poco y algunos pasos en falso, aquí está la solución. El problema con el que me topé es asegurarme de usar " http://example.com $ uri". Insertar un / delante de $ uri resulta en una redirección a http://example.com//

  server {
    listen 80;
    server_name www.example.com;
    rewrite ^ http://example.com$uri permanent;
  }

  # the server directive is nginx's virtual host directive.
  server {
    # port to listen on. Can also be set to an IP:PORT
    listen 80;

    # Set the charset
    charset utf-8;

    # Set the max size for file uploads to 10Mb
    client_max_body_size 10M;

    # sets the domain[s] that this vhost server requests for
    server_name example.com;

    # doc root
    root /var/www/example.com;

    # vhost specific access log
    access_log  /var/log/nginx_access.log  main;


    # set vary to off to avoid duplicate headers
    gzip off;
    gzip_vary off;


    # Set image format types to expire in a very long time
    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ {
        access_log off;
        expires max;
    }

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }

    # Catchall for everything else
    location / {
      root /var/www/example.com;
      access_log off;

      index index.html;
      expires 1d;

      if (-f $request_filename) {
        break;
      }
    }
  }
Jauder Ho
fuente
4

Visite esta pregunta en SO: https://stackoverflow.com/a/11733363/846634

De la mejor respuesta:

En realidad , ni siquiera necesitas una reescritura.

server {
    #listen 80 is default
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    #listen 80 is default
    server_name example.com;
    ## here goes the rest of your conf...
}

Como mi respuesta es obtener más y más votos, pero también lo anterior. Nunca debe usar a rewriteen este contexto. ¿Por qué? Porque nginx tiene que procesar e iniciar una búsqueda. Si usa return(que debería estar disponible en cualquier versión nginx), detiene directamente la ejecución. Esto se prefiere en cualquier contexto.

Ali
fuente
1

Para redirigir a no www, modifique el archivo vhost:

server {
  listen 80;
  server_name www.example.com;
  rewrite ^/(.*) http://example.com/$1 permanent;
}

'Permanente' convierte la redirección en una redirección 301. Después de este bloque de código, puede configurar el dominio sin www.

Para redirigir no www a www:

server {
  listen 80;
  server_name example.com;
  rewrite ^/(.*) http://www.example.com/$1 permanent;
}

Thassit

Por cierto, para la configuración completa de VPS usando Nginx, consulte la Biblia VPS en mi sitio, guvnr.com, ¡y espero que sea útil!

Joel Coel
fuente
0

Esto es lo que uso:

# ---------------------------------------
# vHost www.example.com
# ---------------------------------------

server {

##
# Redirect www.domain.tld
##

    server_name  www.example.com;
    rewrite ^(.*) http://example.com$1 permanent;

}

# ---------------------------------------
# vHost example.com
# ---------------------------------------

server {

   # Something Something
}
Neel
fuente