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 o server
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.
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 server
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
to www
/ regex em um single dedicado server
para todos os sites:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
www
para non- www
w / regex em um single dedicado server
para todos os sites:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
para non- www
w / regex em um dedicado apenas server
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
e 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 pcretest
no seu sistema, que é exatamente a mesma pcre
biblioteca 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 if
dentro 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 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
para www
:
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
www
para 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 server
pode 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 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.