Nginx: encaminha todos os subdomínios

3

Meu código não funciona com tlds de segundo nível como domain.co.uk

Aqui está o meu conf:

  # 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;
  }

EDITAR: Agora estou usando isso. Funciona bem:

# 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;
    }
    
por mgutt 25.05.2010 / 18:01

2 respostas

2

Sua configuração original não está aproveitando a configuração do nginx. Com uma reescrita como essa, o nginx terá que fazer uma análise extensiva em cada solicitação. Se você estiver em um ambiente em que o desempenho e o tempo de resposta rápido são essenciais, use os blocos de servidor.

# Add www and redirect subdomains.
server {  
    listen      80;
    server_name domain.com *.domain.com;
    rewrite     ^ http://www.domain.com$request_uri permanent;
}

Desta forma, não há uma análise complexa, o Nginx usa uma tabela de hash para as pesquisas do servidor e a reescrita usa a variável $ request_uri já analisada.

    
por 25.05.2010 / 19:46
1

Não sei por que você tem duas versões. Aqui está o que eu tenho na minha configuração. remove www. do início de qualquer domínio:

server {
    # omitting listen/server_name/access_log/error_log

    if ($host ~* www\.(.*)) {
        set $wwwless $1;
        rewrite ^(.*)$ $scheme://$wwwless$1 permanent;
    }

    # locations, other rules, etc
}
    
por 25.05.2010 / 19:27