Назад | Перейти на главную страницу

Nginx: перенаправить все поддомены

Мой код не работает с 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
}