Лучшая практика: отдельно 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, так как у вас должен быть один сертификат для всех ваших доменных имен, если вы хотите, чтобы это работало правильно.
non- wwwto www/ 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чтобы не www/ 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;
}
Тестирование регулярных выражений с 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 Address / Site Address их нет. Независимо от того, как вы сконфигурируете свой nginx, если у вас есть www в этих URL, он будет перенаправлен на тот, в котором есть www.