Nginx no-www www www y sin www


Estoy usando nginx en Rackspace cloud siguiendo un tutorial y habiendo buscado en la red y hasta ahora no puedo ordenarlo.

Quiero www.mysite.com para ir a mysite.com como normal .htaccess por SEO y otras razones.

My / etc / nginx / sites-available / www. example.com. vhost config:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

También he intentado

server {
       listen 80;
       server_name example.com;
       root /var/www/www.example.com/web;

       if ($http_host != "www.example.com") {
                 rewrite ^ http://example.com$request_uri permanent;
       }

También lo intenté. Los dos segundos intentos dan errores de bucle de redirección.

if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}

Mi DNS está configurado como estándar:

site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds

(IPs y carpetas de ejemplo se han utilizado para ejemplos y para ayudar a las personas en el futuro). Yo uso Ubuntu 11.

Author: TheBlackBenzKid, 2011-10-30

15 answers

Solución HTTP

De la documentación , "la forma correcta es definir un servidor separado para example.org":

server {
    listen       80;
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}

server {
    listen       80;
    server_name  www.example.com;
    ...
}

Solución HTTPS

Para aquellos que quieren una solución que incluya https://...

server {
        listen 80;
        server_name www.domain.com;
        # $scheme will get the http protocol
        # and 301 is best practice for tablet, phone, desktop and seo
        return 301 $scheme://domain.com$request_uri;
}

server {
        listen 80;
        server_name domain.com;
        # here goes the rest of your config file
        # example 
        location / {

            rewrite ^/cp/login?$ /cp/login.php last;
            # etc etc...

        }
}

Nota: No he incluido originalmente https:// en mi solución ya que usamos loadbalancers y nuestro servidor https:// es un servidor de pago SSL de alto tráfico: no mezclamos https:// y http://.


Para comprobar la versión de nginx, utilice nginx -v.

Strip www from url with nginx redirect

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

server {
    server_name  domain.com;
    #The rest of your configuration goes here#
}

Por lo que necesita tener DOS códigos de servidor.

Añadir la www a la url con nginx redirect

Si lo que necesita es lo contrario, redirigir desde domain.com to www.domain.com, puedes usar esto:

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

server {
    server_name  www.domain.com;
    #The rest of your configuration goes here#
}

Como se puede imaginar, esto es justo lo contrario y funciona de la misma manera que el primer ejemplo. De esta manera, no obtienes marcas de SEO, ya que es una redirección permanente completa y se mueve. El no WWW es forzado y el directorio se muestra!

Parte de mi código se muestra a continuación para una mejor vista:

server {
    server_name  www.google.com;
    rewrite ^(.*) http://google.com$1 permanent;
}
server {
       listen 80;
       server_name google.com;
       index index.php index.html;
       ####
       # now pull the site from one directory #
       root /var/www/www.google.com/web;
       # done #
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
}
 734
Author: TheBlackBenzKid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 17:32:15

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 está recibiendo más y más votos positivos, pero lo anterior también. Nunca debe usar un rewrite en este contexto. ¿Por qué? Porque nginx tiene que procesar e iniciar una búsqueda. Si utiliza return (que debería estar disponible en cualquier versión de nginx) detiene directamente la ejecución. Esto es preferible en cualquier contexto.

Redirigir ambos, no SSL y SSL a su contraparte no www:

server {
    listen               80;
    listen               443 ssl;
    server_name          www.example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    return 301 $scheme://example.com$request_uri;
}

server {
    listen               80;
    listen               443 ssl;
    server_name          example.com;
    ssl_certificate      path/to/cert;
    ssl_certificate_key  path/to/key;

    # rest goes here...
}

La variable $scheme solo contendrá http si su servidor solo está escuchando en el puerto 80 (predeterminado) y la opción escuchar no contiene la palabra clave ssl. No usar la variable no le dará ningún rendimiento.

Tenga en cuenta que necesita incluso más bloques de servidor si utiliza HSTS, porque las cabeceras HSTS no deben enviarse a través de conexiones no cifradas. Por lo tanto, necesita bloques de servidor sin cifrar con redirecciones y bloques de servidor encriptados con redirecciones y encabezados HSTS.

Redirigir todo a SSL (configuración personal en UNIX con IPv4, IPv6, SPDY,...):

#
# Redirect all www to non-www
#
server {
    server_name          www.example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:80;
    listen               *:443 ssl spdy;
    listen               [::]:80 ipv6only=on;
    listen               [::]:443 ssl spdy ipv6only=on;

    return 301 https://example.com$request_uri;
}

#
# Redirect all non-encrypted to encrypted
#
server {
    server_name          example.com;
    listen               *:80;
    listen               [::]:80;

    return 301 https://example.com$request_uri;
}

#
# There we go!
#
server {
    server_name          example.com;
    ssl_certificate      ssl/example.com/crt;
    ssl_certificate_key  ssl/example.com/key;
    listen               *:443 ssl spdy;
    listen               [::]:443 ssl spdy;

    # rest goes here...
}

Supongo que puedes imaginar otros compuestos con este patrón ahora por ti mismo.

¿Más de mis configuraciones? Vaya aquí y aquí.

 355
Author: Fleshgrinder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-22 12:39:30

Puede descubrir que desea usar la misma configuración para más dominios.

El siguiente fragmento elimina www antes de cualquier dominio:

if ($host ~* ^www\.(.*)$) {
    rewrite / $scheme://$1 permanent;
}
 27
Author: Martin Höger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 13:09:38

Aquí está cómo hacerlo para varios nombres de servidor www a no-www (usé esto para subdominios):

server {
        server_name 
             "~^www\.(sub1.example.com)$"
             "~^www\.(sub2.example.com)$"
             "~^www\.(sub3.example.com)$";
         return 301 $scheme://$1$request_uri ;
}
 20
Author: Eric Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 17:00:29

Necesita dos bloques de servidor.

Pon esto en tu archivo de configuración eg /etc/nginx/sites-available/sitename

Digamos que decides tener http://example.com como dirección principal a utilizar.

Su archivo de configuración debería tener este aspecto:

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
server {
        listen 80;
        listen [::]:80;
        server_name example.com;

        # this is the main server block
        # insert ALL other config or settings in this server block
}

El primer bloque del servidor contendrá las instrucciones para redirigir cualquier solicitud con el prefijo 'www'. Escucha las solicitudes de la URL con el prefijo ' www ' y redirecciones.

No hace otra cosa.

El segundo bloque de servidor mantenga su dirección principal: la URL que desea usar. Todos los demás ajustes van aquí como root, index, location, etc. Compruebe el archivo predeterminado para estas otras configuraciones que puede incluir en el bloque de servidor.

El servidor necesita dos registros DNS A.

Name: @ IPAddress: your-ip-address (for the example.com URL)

Name: www IPAddress: your-ip-address (for the www.example.com URL)

Para ipv6 cree el par de registros AAAA usando su dirección-ipv6 -.

 17
Author: Red,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-18 02:07:53

Esta solución viene de mi experiencia personal. Utilizamos varios buckets de Amazon S3 y un servidor para redirigir non-www a www nombres de dominio para que coincidan con la política de encabezado "Host" de S3.

Usé la siguiente configuración para servidor nginx :

server {
    listen 80;
    server_name ~^(?!www\.)(?<domain>.+)$;
    return 301 $scheme://www.$domain$request_uri;
}

Esto coincide con todos los nombres de dominio que apuntan al servidor comenzando con lo que sea excepto www. y redirige a www.<domain>. De la misma manera puedes hacer redireccionamiento opuesto de www a non-www.

 14
Author: VisioN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 15:44:33

Prueba esto

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.yoursite.com$1;
    }

Otra manera: Nginx no-www a www

server {
  listen       80;
  server_name  yoursite.com;
  root /path/;
  index index.php;
  return       301 https://www.yoursite.com$request_uri;
}

Y www a no-www

server {
  listen       80;
  server_name  www.yoursite.com;
  root /path/;
  index index.php;
  return       301 https://yoursite.com$request_uri;
}
 10
Author: Kevin Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 17:38:12

Formato único:

server {
  listen 80;
  server_name "~^www\.(.*)$" ;
  return 301 https://$1$request_uri ;
}
 7
Author: Andriyun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-19 16:01:47

Redireccionar no www a www

Para Un Solo Dominio:

server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}

Para Todos los Dominios:

server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}

Redireccionar www a no www Para Dominio Único:

server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

Para Todos los Dominios:

server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}
 7
Author: Ravindra Bhalothia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 07:19:11

Combiné lo mejor de todas las respuestas simples, sin dominios codificados.

301 redirección permanente de no www a www (HTTP o HTTPS):

server {
    if ($host !~ ^www\.) {
        rewrite ^ $scheme://www.$host$request_uri permanent;
    }

    # Regular location configs...
}

Si prefiere no-HTTPS, no-www a HTTPS, www redirigir al mismo tiempo:

server {
    listen 80;

    if ($host !~ ^www\.) {
        rewrite ^ https://www.$host$request_uri permanent;
    }

    rewrite ^ https://$host$request_uri permanent;
}
 6
Author: Matt Janssen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 02:56:30
location / { 
    if ($http_host !~ "^www.domain.com"){ 
        rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; 
    } 
}
 4
Author: Maoz Zadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 17:09:50

No estoy seguro de si alguien se da cuenta de que puede ser correcto devolver un 301, pero los navegadores se ahogan en él para hacer

rewrite ^(.*)$ https://yoursite.com$1; 

Es más rápido que:

return 301 $scheme://yoursite.com$request_uri;
 3
Author: steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 01:33:15

Blog de fantasmas

Para hacer que el método recomendado de nginx con return 301 $scheme://example.com$request_uri; funcione con Ghost, deberá agregar en su bloque de servidor principal:

proxy_set_header    X-Real-IP           $remote_addr;
proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
proxy_set_header    Host                $http_host;
proxy_set_header    X-Forwarded-Proto   $scheme;
proxy_set_header    X-NginX-Proxy       true;

proxy_pass_header   X-CSRF-TOKEN;
proxy_buffering     off;
proxy_redirect      off;  
 2
Author: nottinhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-15 15:58:51
if ($host ~* ^www.example.com$) {
    return 301 $scheme://example.com$request_uri;
}
 0
Author: karadayi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-10 21:36:31

Si tiene problemas para que esto funcione, es posible que deba agregar la dirección IP de su servidor. Por ejemplo:

server {
listen XXX.XXX.XXX.XXX:80;
listen XXX.XXX.XXX.XXX:443 ssl;
ssl_certificate /var/www/example.com/web/ssl/example.com.crt;
ssl_certificate_key /var/www/example.com/web/ssl/example.com.key;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}

Donde XXX. XXX. XXX. XXX es la dirección IP (obviamente).

Nota: ssl crt y la ubicación clave deben definirse para redirigir correctamente las solicitudes https

No olvide reiniciar nginx después de realizar los cambios:

service nginx restart
 -5
Author: undoIT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-28 21:36:36