Esta é uma boa prática para criar subdomínios?

5

Estou tentando criar subdomínios com meu aplicativo da web, no entanto, não tenho muita experiência em nginx, estou tentando encontrar uma solução estável do SF, mas infelizmente não consigo encontrar uma solução boa .

O problema que estou tentando fazer é criar subdomínios flexíveis, por exemplo, se eu tiver qualquer subdomínio como dev.example.com , ele deve seguir o diretório de arquivos /var/www/example.com/www/dev e qualquer tipo de subdomínio (exceto WWW) tente encontrar um diretório, se existir, torne-o root.

/var/www/example.com/www/{subdomain}

É o diretório atual para procurar, se não existir, a raiz padrão seria:

/var/www/example.com/www/

Este é o meu ficheiro de configuração sites-enabled para o meu domínio.

server {

    server_name     example.com www.example.com;
    root            /var/www/example.com/www;
    index           index.php index.htm index.html;
    error_page      404 /404.html;
    error_page      500 502 503 504  /50x.html;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    error_page 404 /index.php;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location /pma {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }

    location /dev {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }

    location ~ /\.ht
    {
        deny all;
    }
}

server {

    server_name     pma.example.com;
    index           index.php;
    root            /var/www/example.com/www/pma;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;
    }
}

server {

    server_name     dev.example.com;
    index           index.php;
    root            /var/www/example.com/www/dev;

    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Website development";
        auth_basic_user_file  /var/www/example.com/www/dev/authfile;

        if ($request_uri ~* ^(/home(/index)?|/index(.php)?)/?$)
        {
            rewrite ^(.*)$ / permanent;
        }

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

        if ($request_uri ~* index/?$)
        {
            rewrite ^/(.*)/index/?$ /$1 permanent;
        }

        if (!-d $request_filename)
        {
            rewrite ^/(.+)/$ /$1 permanent;
        }

        if ($request_uri ~* ^/system)
        {
            rewrite ^/(.*)$ /index.php?/$1 last;
            break;
        }

        if (!-e $request_filename)
        {
            rewrite ^/(.*)$ /index.php?/$1 last;
            break;
        }
    }

    location ~ /\.ht
    {
        deny all;
    }
}

EDITAR: Arquivo conf atualizado:

server {

    #regex capture assigning the subdomain to $subdomain
    server_name ~^(?<subdomain>.+)\.example\.com$;

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

    #if the directory doesn't exist, redirect to the main site
    if (!-d /var/www/example.com/www/$subdomain) {
        rewrite . example.com redirect;
    }

    #if we have made it here, set the root to the above directory
    root /var/www/example.com/www/$subdomain;

    #the rest of your config
    index           index.php;
    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/$subdomain$fastcgi_script_name;
        include fastcgi_params;
    }

    # this needs to be enabled for dev.example.com and pma.example.com only
    location / {
        auth_basic            "Authentication Required";
        auth_basic_user_file  /var/www/example.com/$subdomain/authfile;
    }

    location ~ /\.ht{
        deny all;
    }
}
    
por Lewis 21.11.2011 / 04:48

1 resposta

1

Se você estiver procurando por subdomínios automáticos, com base em um modelo padrão (por exemplo, um subdomínio para cada usuário), poderá usar capturas de expressões regulares na diretiva server_name. Essa abordagem permitirá que você atribua parte do server_name a uma variável para usar em outro lugar na sua configuração (por exemplo, para definir um caminho).

Geralmente é uma boa prática colocar subdomínios 'reais' acima da raiz da web, para separar melhor os sites (e tem a vantagem de impedir o acesso através do site principal) e para evitar ambigüidade quanto a se um diretório é ou não mapeia para um subdomínio ou não. Por exemplo, considere o seguinte caminho para a raiz do subdomínio 'dev': /var/www/example.com/subdomains/dev/www. Isso também permitiria que você mantivesse registros separados para seu site de desenvolvimento, por exemplo, /var/www/example.com/subdomains/dev/logs).

O exemplo abaixo usa seu subdomínio pma como modelo e mantém a raiz do subdomínio sob o site principal.

server{
    #regex capture assigning the subdomain to $subdomain
    server_name ~^(?<subdomain>.+)\.example\.com$;

    #if the directory doesn't exist, redirect to the main site
    if (!-d /var/www/example.com/www/$subdomain) {
        rewrite . example.com redirect;
    }

    #if we have made it here, set the root to the above directory
    root /var/www/example.com/www/$subdomain;

    #the rest of your config
    index           index.php;
    access_log      /var/www/example.com/logs/access.log;
    error_log       /var/www/example.com/logs/errors.log;

    location ~ \.php$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/domain.com/$subdomain$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        auth_basic            "Authentication Required";
        auth_basic_user_file  /var/www/example.com/$subdomain/authfile;
    }

    location ~ /\.ht{
        deny all;
    }

}

A ideia acima só funciona se todos os subdomínios seguirem o mesmo modelo. Na configuração que você postou, o subdomínio pma e o subdomínio dev são substancialmente diferentes (em que o subdomínio dev tem muitos reescreve que o pma não tem). Qualquer subdomínio que não siga o 'template' que você está usando precisará do seu próprio bloco de servidor e config. Vale a pena mencionar que, no caso de dois blocos de servidor serem aplicáveis (por exemplo, um com um nome de servidor estático e outro com um nome de servidor de regex), o nome de servidor estático terá precedência.

    
por 21.11.2011 / 14:14