Мой код не работает с tld второго уровня, например domain.co.uk
Вот мой конф:
# add www.
if ($host ~ ^(?!www)) {
rewrite ^/(.*)$ http://www.$host/$1 permanent;
}
# remove subdomain
if ($host ~ "^www\.(.*)\.(.*\.([a-z]{2,4}|[a-z]{2}\.[a-z]{2}))") {
set $host_without_sub $2;
rewrite ^/(.*)$ http://www.$host_without_sub/$1 permanent;
}
РЕДАКТИРОВАТЬ: Теперь я использую это. Работает нормально:
# rules
server {
#general
listen 80;
# add www.
if ($host ~ ^(?!www)) {
rewrite ^/(.*)$ http://www.$host/$1 permanent;
}
# remove subdomain
if ($host ~ "^www\.(.*?)\.(.{3,}\.([a-z]{2}\.[a-z]{2}|[a-z]{2,4}))$") {
set $host_without_sub $2;
rewrite ^/(.*)$ http://www.$host_without_sub/$1 permanent;
}
Ваша исходная конфигурация не использует конфигурацию nginx. При такой перезаписи nginx должен будет выполнять обширный синтаксический анализ каждого запроса. Если вы находитесь в среде, где важны производительность и быстрое время отклика, вам следует использовать серверные блоки.
# Add www and redirect subdomains.
server {
listen 80;
server_name domain.com *.domain.com;
rewrite ^ http://www.domain.com$request_uri permanent;
}
Таким образом, нет сложного синтаксического анализа, Nginx использует хеш-таблицу для поиска на сервере, а при перезаписи используется уже проанализированная переменная $ request_uri.
Я не уверен, почему у вас две версии. Вот что у меня в config. это удаляет www.
с начала любого домена:
server {
# omitting listen/server_name/access_log/error_log
if ($host ~* www\.(.*)) {
set $wwwless $1;
rewrite ^(.*)$ $scheme://$wwwless$1 permanent;
}
# locations, other rules, etc
}