Лучшая практика: отдельно 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- www
to www
/ 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
чтобы не 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.