Prática recomendada: separado servercom código fixoserver_name
A melhor prática com o nginx é usar um separado serverpara um redirecionamento como este (não compartilhado com o serverda 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.
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name www.example.org;
return 301 $scheme://example.org$request_uri;
}
server {
server_name example.com example.org;
# real configuration goes here
}
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 separado serverainda 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- wwwto www/ regex em um single dedicado serverpara todos os sites:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
wwwpara non- wwww / regex em um single dedicado serverpara todos os sites:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
wwwpara non- wwww / regex em um dedicado apenas serverpara 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.come www.subdomain.example.net:
server {
server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
return 301 $scheme://$domain$request_uri;
}
Testando expressões regulares com nginx
Você pode testar se o regex funciona conforme o esperado pcretestno seu sistema, que é exatamente a mesma pcrebiblioteca que o nginx usará para expressões regulares:
% pcretest
PCRE version 8.35 2014-04-04
re> #^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$#
data> test
No match
data> www.example.org
0: www.example.org
1: example.org
data> www.test.example.org
No match
data> www.example.com
0: www.example.com
1: example.com
data> www.subdomain.example.net
0: www.subdomain.example.net
1: subdomain.example.net
data> subdomain.example.net
No match
data> www.subdomain.example.net.
No match
data>
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 ifdentro do server/ 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 serverdefiniçõ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 wwwpara www:
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
wwwpara não www:
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
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 serverpode usar, ainda pode fazer sentido codificar explicitamente um único domínio preferido:
if ($host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
Referências:
Dashboard > Settings > General Settingse verifique se não háwwwnos 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.