Como obter o nginx para redirecionar de www para non-www domain?

9

Digamos que eu queira redirecionar de www.example.com para example.com e quero fazer isso usando nginx. Olhei em volta e não vi nenhuma boa documentação sobre isso, então pensei em perguntar e responder minha própria pergunta.

    
por Jauder Ho 05.07.2009 / 03:31

5 respostas

4

Após algumas pesquisas e alguns erros, aqui está a solução. A pegadinha que eu encontrei é usar " link $ uri". Inserir um / na frente de $ uri resulta em um redirecionamento para o link

  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;
      }
    }
  }
    
por 05.07.2009 / 03:35
7

Eu também vi isso no wiki do Nginx e em outros blogs e a melhor maneira de desempenho é fazer o seguinte:

Para redirecionar de www.example.com para example.com usando o nginx (versão 1.0.12 no momento da gravação).

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
}

Quando as solicitações chegam a example.com, nenhuma instrução if é usada para desempenho. E ele usa $ request_uri ao invés de ter que criar uma partida de $ 1 que tributa a reescrita (veja a página Nginx Common Pitfalls).

Fontes:

por 10.02.2012 / 17:37
4

Por favor, visite esta pergunta em SO: link

A partir da melhor resposta:

Na verdade, você nem precisa reescrever.

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 minha resposta está recebendo mais e mais votos, mas o acima também. Você nunca deve usar um rewrite neste contexto. Por quê? Porque o nginx precisa processar e iniciar uma pesquisa. Se você usar return (que deve estar disponível em qualquer versão do nginx), ele interromperá diretamente a execução. Isto é preferido em qualquer contexto.

    
por 05.08.2013 / 12:32
1

Para redirecionar para não-www, altere o arquivo vhost:

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

'Permanente' transforma o redirecionamento em um redirecionamento 301. Após este bloco de código, você pode configurar o domínio sem www.

Para redirecionar o não-www para o www:

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

Thassit.

BTW, para configuração VPS completa usando o Nginx, confira a VPS Bible no meu site, guvnr.com, e espero que seja útil!

    
por 09.07.2009 / 20:23
0

Isso é o que eu 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
}
    
por 14.10.2014 / 23:45