Najlepsza praktyka: osobno server
w / hardcodedserver_name
Najlepszą praktyką w przypadku nginx jest użycie oddzielnego server
dla takiego przekierowania (nieudostępnionego w server
głównej konfiguracji), zakodowanie wszystkiego na sztywno i nie używanie wyrażeń regularnych.
Konieczne może być również zakodowanie domen na stałe, jeśli używasz HTTPS, ponieważ musisz z góry wiedzieć, które certyfikaty będziesz zapewniał.
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
}
Używanie wyrażeń regularnych w obrębie server_name
Jeśli masz wiele witryn i nie dbasz o najwyższą wydajność, ale chcesz, aby każda z nich miała takie same zasady dotyczące www.
prefiksu, możesz użyć wyrażeń regularnych. Najlepsza praktyka korzystania z osobnego server
nadal będzie obowiązywać .
Pamiętaj, że to rozwiązanie staje się trudne, jeśli używasz protokołu https, ponieważ musisz mieć jeden certyfikat na wszystkie nazwy domen, jeśli chcesz, aby działał poprawnie.
nie- www
do www
w / regex w dedykowanym pojedynczy server
dla wszystkich stron:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
www
do non- www
w / regex w dedykowanym singlu server
dla wszystkich witryn:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
do non- www
w / regex w dedykowanym tylko server
dla niektórych witryn:
Konieczne może być ograniczenie wyrażenia regularnego, aby obejmowało tylko kilka domen, wtedy możesz użyć czegoś takiego, aby dopasować www.example.org
, www.example.com
iwww.subdomain.example.net
:
server {
server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
return 301 $scheme://$domain$request_uri;
}
Testowanie wyrażeń regularnych w / nginx
Możesz sprawdzić, czy wyrażenie regularne działa zgodnie z oczekiwaniami pcretest
w twoim systemie, co jest dokładnie takie samopcre
biblioteką, której twój nginx będzie używał do wyrażeń regularnych:
% 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>
Zauważ, że nie musisz się martwić kropkami ani wielkością liter, ponieważ nginx już się tym zajmuje, tak jak w wyrażeniu regularnym nazwy serwera nginx, gdy nagłówek „Host” ma kropkę końcową .
Posyp if
w istniejącymserver
/ HTTPS:
To ostateczne rozwiązanie na ogół nie jest uważane za najlepszą praktykę, jednak nadal działa i działa.
W rzeczywistości, jeśli używasz HTTPS, to końcowe rozwiązanie może okazać się łatwiejsze w utrzymaniu, ponieważ nie musisz kopiować i wklejać całego zestawu dyrektyw ssl między różnymi server
definicjami, a zamiast tego możesz umieścić fragmenty tylko w potrzebnych serwerów, co ułatwia debugowanie i zarządzanie witrynami.
non- www
to www
:
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
www
do non- www
:
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
zakodować na stałe jedną preferowaną domenę
Jeśli chcesz nieco większej wydajności, a także spójności między wieloma domenami, z których jedna server
może korzystać, nadal może być sensowne jawne zakodowanie jednej preferowanej domeny:
if ($host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
Bibliografia:
Dashboard > Settings > General Settings
i upewnij się, że nie ma żadnychwww
adresów URL adresu / adresu strony WordPress. Bez względu na to, jak skonfigurujesz swój nginx, jeśli masz www w tych adresach URL, zostanie przekierowane do tego z www w nim.