Estou usando o nginx na nuvem da Rackspace, seguindo um tutorial e tendo pesquisado na net e até agora não consigo resolver isso.
Quero que www.mysite.com acesse meu site.com normalmente no .htaccess por SEO e outros motivos.
Minha configuração do /etc/nginx/sites-available/www.example.com.vhost :
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;
}
Eu também tentei
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;
}
Eu também tentei. Ambas as segundas tentativas fornecem erros de loop de redirecionamento.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Meu DNS está configurado como padrão:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(IPs e pastas de exemplo foram usados para exemplos e para ajudar pessoas no futuro). Eu uso o Ubuntu 11.
Dashboard > Settings > General Settings
e verifique se não háwww
nos URLs de endereço / endereço do site do WordPress. Não importa como você configure seu nginx, se você tiver um www nesses URLs, ele será redirecionado para aquele com www.Respostas:
Solução HTTP
Na documentação , "o caminho certo é definir um servidor separado para example.org":
Solução HTTPS
Para quem quer uma solução, incluindo
https://
...Nota: originalmente não incluí
https://
na minha solução, pois usamos balanceadores de carga e nosso servidor https: // é um servidor de pagamento SSL de alto tráfego: não combinamos https: // e http: //.Para verificar a versão do nginx, use
nginx -v
.Retire o www do URL com o redirecionamento nginx
Então você precisa ter dois códigos de servidor.
Adicione o www ao URL com redirecionamento nginx
Se o que você precisa é o contrário, para redirecionar de domain.com para www.domain.com, você pode usar o seguinte:
Como você pode imaginar, isso é exatamente o oposto e funciona da mesma maneira que o primeiro exemplo. Dessa forma, você não obtém as marcas de SEO, pois ele é completo, permite redirecionar e mover. A não WWW é forçada e o diretório é mostrado!
Alguns dos meus códigos mostrados abaixo para uma melhor visualização:
fonte
return 301 $scheme://domain.com$request_uri;
. Não há necessidade de capturar quaisquer padrões, consulte armadilhas NginxNa verdade, você nem precisa de uma reescrita.
Como minha resposta está recebendo mais e mais votos, mas o acima também. Você nunca deve usar um
rewrite
nesse contexto. Por quê? Porque o nginx precisa processar e iniciar uma pesquisa. Se você usarreturn
(que deve estar disponível em qualquer versão do nginx), ele interrompe diretamente a execução. Isso é preferido em qualquer contexto.Redirecione ambos, não SSL e SSL para sua contraparte não www:
A
$scheme
variável conterá apenashttp
se o servidor estiver escutando apenas na porta 80 (padrão) e a opção de escuta não contiver assl
palavra - chave. Não usar a variável não terá nenhum desempenho.Observe que você precisa de ainda mais blocos de servidor se usar o HSTS, porque os cabeçalhos do HSTS não devem ser enviados por conexões não criptografadas. Portanto, você precisa de blocos de servidor não criptografados com redirecionamentos e blocos de servidor criptografados com redirecionamentos e cabeçalhos HSTS.
Redirecione tudo para SSL (configuração pessoal no UNIX com IPv4, IPv6, SPDY, ...):
Eu acho que você pode imaginar outros compostos com esse padrão agora sozinho.
Mais das minhas configurações? Vá aqui e aqui .
fonte
Você pode descobrir que deseja usar a mesma configuração para mais domínios.
O fragmento a seguir remove www antes de qualquer domínio:
fonte
http
para$scheme
return ...
erewrite ... last
". Algum link atualizado para problemas de desempenho?Você precisa de dois blocos de servidor.
Coloque-os no seu arquivo de configuração, por exemplo
/etc/nginx/sites-available/sitename
Digamos que você decida ter http://example.com como o endereço principal a ser usado.
Seu arquivo de configuração deve ficar assim:
O primeiro bloco do servidor conterá as instruções para redirecionar todas as solicitações com o prefixo 'www'. Ele escuta solicitações de URL com o prefixo 'www' e redireciona.
Não faz mais nada.
O segundo bloco do servidor conterá o seu endereço principal - o URL que você deseja usar. Todas as outras configurações aqui como
root
,index
,location
, etc. Verifique o arquivo padrão para essas outras configurações que você pode incluir no bloco de servidor.O servidor precisa de dois registros DNS A.
Para o ipv6, crie o par de registros AAAA usando o seu endereço-ipv6.
fonte
Veja como fazer isso para vários nomes de servidores www para no-www (usei isso para subdomínios):
fonte
Prática recomendada: separado
server
com código fixoserver_name
A melhor prática com o nginx é usar um separado
server
para um redirecionamento como este (não compartilhado com oserver
da sua configuração principal), codificar tudo e não usar expressões regulares.Também pode ser necessário codificar os domínios se você estiver usando HTTPS, porque é necessário saber antecipadamente quais certificados você estará fornecendo.
Usando expressões regulares em
server_name
Se você possui vários sites e não se importa com o melhor desempenho, mas deseja que cada um deles tenha a mesma política em relação ao
www.
prefixo, poderá usar expressões regulares. A melhor prática de usar um separadoserver
ainda permaneceria.Observe que esta solução fica complicada se você usar https, pois você deve ter um único certificado para cobrir todos os seus nomes de domínio, se quiser que isso funcione corretamente.
non-
www
towww
/ regex em um single dedicadoserver
para todos os sites:www
para non-www
w / regex em um single dedicadoserver
para todos os sites:www
para non-www
w / regex em um dedicado apenasserver
para alguns sites:Pode ser necessário restringir a regex para cobrir apenas um par de domínios, em seguida, você pode usar algo como isto apenas corresponder
www.example.org
,www.example.com
ewww.subdomain.example.net
:Testando expressões regulares com nginx
Você pode testar se o regex funciona conforme o esperado
pcretest
no seu sistema, que é exatamente a mesmapcre
biblioteca que o nginx usará para expressões regulares:Observe que você não precisa se preocupar com pontos ou maiúsculas à direita, pois o nginx já cuida disso, conforme regex do nome do servidor nginx quando o cabeçalho "Host" possui um ponto à direita .
Polvilhe
if
dentro doserver
/ HTTPS existente :Essa solução final geralmente não é considerada a melhor prática, no entanto, ainda funciona e faz o trabalho.
De fato, se você estiver usando HTTPS, essa solução final poderá ficar mais fácil de manter, pois você não precisará copiar e colar várias diretivas ssl entre as diferentes
server
definições e, em vez disso, poderá colocar os snippets apenas em os servidores necessários, facilitando a depuração e manutenção de seus sites.não
www
parawww
:www
para nãowww
:codificar um único domínio preferido
Se você deseja um pouco mais de desempenho, além da consistência entre vários domínios que um único
server
pode usar, ainda pode fazer sentido codificar explicitamente um único domínio preferido:Referências:
fonte
Esta solução vem da minha experiência pessoal. Usamos vários buckets do Amazon S3 e um servidor para redirecionar
non-www
parawww
nomes de domínio para corresponder à política de cabeçalho "Host" do S3 .Eu usei a seguinte configuração para o servidor nginx :
Isso corresponde a todos os nomes de domínio apontados para o servidor começando com o que quer que seja
www.
e redireciona parawww.<domain>
. Da mesma maneira, você pode fazer o redirecionamento oposto dewww
paranon-www
.fonte
listen 80
você precisa adicionarlisten 443 ssl
e entãossl_certificate
essl_certificate_key
diretivas.listen 443 ssl
com o certificado ausente. Isso não funciona e está causando algumas sérias dores de cabeça.Combinei o melhor de todas as respostas simples, sem domínios codificados.
301 redirecionamento permanente de não www para www (HTTP ou HTTPS):
Se você preferir não HTTPS, não www para HTTPS, www redirecione ao mesmo tempo:
fonte
Redirecionar não www para www
Para domínio único:
Para todos os domínios:
Redirecione www para não www para Domínio Único:
Para todos os domínios:
fonte
80
e443
?listen
diretivas para mim (nginx 1.4.6).tente isso
Outra maneira: Nginx no-www para www
e www para no-www
fonte
Formato exclusivo:
fonte
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
fonte
$scheme://www.domain.com$1
para evitar barra duplanão tenho certeza se alguém notou que pode ser correto retornar um 301, mas os navegadores se engasgam
é mais rápido que:
fonte
Blog fantasma
para que o método nginx seja recomendado
return 301 $scheme://example.com$request_uri;
com o Ghost, você precisará adicionar no bloco principal do servidor:fonte
Se você não deseja codificar o nome de domínio, pode usar este bloco de redirecionamento. O domínio sem o www principal é salvo como variável
$domain
que pode ser reutilizada na instrução de redirecionamento.REF: redirecionando um subdomínio com uma expressão regular em nginx
fonte
fonte
Se estiver com problemas para fazer isso funcionar, pode ser necessário adicionar o endereço IP do seu servidor. Por exemplo:
onde XXX.XXX.XXX.XXX é o endereço IP (obviamente).
Nota: ssl crt e local da chave devem ser definidos para redirecionar corretamente solicitações https
Não se esqueça de reiniciar o nginx depois de fazer as alterações:
fonte
/etc/init.d/nginx reload
você também podereload
usar o servidor, o que não causa nenhum tempo de inatividade.