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

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

Estou tentando criar subdomínios com minha aplicação web, porém, não tenho muita experiência em nginx, tenho tentado encontrar uma solução estável do SF, mas infelizmente não consigo encontrar nenhuma boa solução.

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

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

É o diretório atual a ser procurado; se não existir, a raiz padrão seria:

/var/www/example.com/www/

Este é meu sites-enabledarquivo de configuração para 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;
    }
}

Responder1

Se você está procurando subdomínios automáticos, baseados em um modelo padrão (por exemplo, um subdomínio para cada usuário), você pode usar capturas de expressões regulares em sua diretiva server_name. Esta abordagem permitirá que você atribua parte do server_name a uma variável para uso em outro local da 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 ambiguidade quanto a se um diretório é mapeado ou não para um subdomínio ou não. Por exemplo, considere o seguinte caminho para a raiz do seu subdomínio 'dev': /var/www/example.com/subdomains/dev/www. Isso também permitiria manter logs 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 no 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 realmente 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 (no sentido de que o subdomínio dev tem muitas reescritas que o subdomínio de pma não tem). Quaisquer subdomínios que não sigam o 'modelo' que você está usando precisarão de seu próprio bloco de servidor e configuração. Vale ressaltar que no caso de dois blocos de servidor serem aplicáveis ​​(por exemplo, um com server_name estático e outro com server_name regex), o server_name estático terá precedência.

informação relacionada