Найкраща практика: окремі 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
для www
w / regex у спеціальному синглі server
для всіх сайтів:
server {
server_name ~^(?!www\.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}
www
до non- www
w / regex у спеціальному синглі server
для всіх сайтів:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
www
до non- www
w / 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.