Найкраща практика: окремі serverж / жорсткі кодиserver_name
Найкраща практика для nginx - використовувати окремий serverдля перенаправлення на зразок цього (не поділяється зserver вашою основною конфігурацією), для жорсткого кодування всього і взагалі не використовувати регулярні вирази.
Можливо, також знадобиться жорсткий код доменів, якщо ви використовуєте HTTPS, оскільки ви повинні знати заздалегідь, які сертифікати ви надаєте.
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
}
Використання регулярних виразів всередині server_name
Якщо у вас є кілька сайтів, і ви не дбаєте про найвищу ефективність, але хочете, щоб кожен з них мав однакову політику щодо www.префікса, тоді ви можете використовувати регулярні вирази. Найкраща практика використання окремих serverвсе ще залишатиметься.
Зауважте, що це рішення стає складним, якщо ви використовуєте https, оскільки тоді ви повинні мати єдиний сертифікат для покриття всіх доменних імен, якщо ви хочете, щоб це працювало належним чином.
не wwwдля wwww / regex у спеціальному синглі serverдля всіх сайтів:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
wwwдо non- wwww / regex у спеціальному синглі serverдля всіх сайтів:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
wwwдо non- wwww / regex у виділеномуserver для деяких сайтів:
Може знадобитися обмежити регулярний вираз лише кількома доменами, тоді ви можете використовувати щось подібне лише для відповідності www.example.org, www.example.comі www.subdomain.example.net:
server {
server_name ~^www\.(?<domain>(?:example\.org|example\.com|subdomain\.example\.net))$;
return 301 $scheme://$domain$request_uri;
}
Тестування регулярних виразів w / nginx
Ви можете перевірити, що регулярний вираз працює pcretestу вашій системі так, як очікувалося. Це точно така ж pcreбібліотека, яку буде використовувати ваш nginx для регулярних виразів:
% 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>
Зауважте, що вам не потрібно хвилюватися з приводу крапок або регістру, оскільки nginx вже піклується про це, відповідно до регексу імені сервера nginx, коли в заголовку "Host" є кінцева крапка .
Посипати ifвсередині існуючих server/ HTTPS:
Це остаточне рішення, як правило, не вважається найкращою практикою, однак воно все одно працює і виконує свою роботу.
Насправді, якщо ви використовуєте HTTPS, то це остаточне рішення може бути простішим у обслуговуванні, оскільки вам не доведеться копіювати та вставляти цілу купу директив ssl між різними serverвизначеннями, а замість цього можна розміщувати фрагменти лише у потрібні сервери, що полегшує налагодження та обслуговування ваших сайтів.
не wwwдля www:
if ($host ~ ^(?!www\.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}
wwwдля не www:
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
жорстке кодування одного кращого домену
Якщо ви хочете трохи збільшити продуктивність, а також узгодженість між декількома доменами, які serverможе використовуватись один, можливо, все одно має сенс чітко ввести жорсткий код одного бажаного домену:
if ($host != "example.com") {
return 301 $scheme://example.com$request_uri;
}
Список літератури:
Dashboard > Settings > General Settingsта переконайтеся, що немаєwwwв URL-адресах WordPress / адреса сайту. Незалежно від того, як ви налаштовуєте nginx, якщо у вас є www у цих URL-адресах, він буде переспрямований на той, у якому є www.