ngninx Configuração para domínios dinâmicos (sub)

1

Estou tentando configurar o nginx de uma maneira que signifique menos mexer no futuro.

Eu não quero ter que criar um arquivo de configuração para cada domínio e subdomínio, eu quero um único arquivo de configuração que possa lidar com todos (ou dois se o subdomínio precisar de separação do domínio principal).

Por exemplo, digamos que esses domínios estejam em uso:

  • example.com
    • / var / www / example / public
  • www.example.com
    • / var / www / example / public
  • test.example.com
    • / var / www / example / subdomínios / test / public
  • abc.example.com
    • / var / www / exemplo / subdomínios / abc / public
  • myothersite.com
    • / var / www / myothersite / public

É claro que www e não www não devem coexistir - portanto, um deve redirecionar para o outro. Vamos imaginar que não estou redirecionando de um para outro nesse caso, eles devem usar o mesmo diretório.

Os pontos acima ilustram o tipo de estrutura de diretórios que estou tentando alcançar, mas todas as minhas tentativas falharam até agora.

server {
    listen      80 default_server;
    server_name ~^(www\.)?(?<domain>.+)$;

    # Location of each domain
    location / {
        root   /var/www/$domain/public;
        index index.php index.html index.htm;
    }

    # ... some other config stuffs
}

Eu, então, tentei configurar um arquivo de configuração de subdomínio, no entanto este sempre parece ter a presidência (e também significava que eu tinha que nomear as pastas do meu site como "example.com" ou "example.co.uk") .

Quando fui a um endereço como "test.example.com", ele apareceria nos registros de erro como se tentasse acessar /var/www/test.example.com/public .

Alguma ideia? É muito apreciado!

Estou no CentOS 6.4 e no nginx 1.0.15.

    
por David 09.06.2013 / 17:49

1 resposta

3

Aqui está uma solução. Não é muito elegante, mas funciona.

server {
    listen 80;
    server_name ~^(?<domain>[^\.]+)\.(?<tld>[^\.]+)$;
    root /var/www/$domain/public;

    location / {
       index index.php index.html index.htm;
    }
}

server {
    listen 80;
    server_name ~^(?<subdomain>[^\.]*)\.?(?<domain>[^\.]+)\.(?<tld>[^\.]+)$;
    root /var/www/$domain/subdomains/$subdomain/public;

    location / {
        if ($subdomain = 'www') {
            root /var/www/$domain/public;
        }
        index index.php index.html index.htm;
    }
}

Funciona apenas para domínios de dois e três níveis. Por exemplo, foo.com e test.foo.com, mas não mais.test.foo.com.

    
por 10.06.2013 / 00:03