これはサブドメインを作成するための良い方法でしょうか

これはサブドメインを作成するための良い方法でしょうか

Web アプリケーションでサブドメインを作成しようとしていますが、nginx の経験があまりないため、SF から安定したソリューションを見つけようとしていますが、残念ながら良いソリューションが見つかりません。

私がやろうとしている問題は、柔軟なサブドメインを作成することです。たとえば、 のようなサブドメインがある場合、dev.example.comそれは のファイル ディレクトリに沿って進む必要があり/var/www/example.com/www/dev、任意のタイプのサブドメイン (WWW を除く) はディレクトリを見つけようとし、存在する場合はそれをルートにします。

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

検索する現在のディレクトリです。存在しない場合は、デフォルトのルートは次のようになります。

/var/www/example.com/www/

これはsites-enabled私のドメインの設定ファイルです。

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

編集:更新された conf ファイル:

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

答え1

標準テンプレート (例: すべてのユーザーのサブドメイン) に基づいて自動サブドメインを探している場合は、server_name ディレクティブで正規表現キャプチャを使用できます。このアプローチにより、server_name の一部を変数に割り当てて、構成内の他の場所で使用できるようになります (例: パスを設定するため)。

一般的に、Web ルートの上に「実際の」サブドメインを配置することは、サイトをより適切に分離し (メイン サイト経由のアクセスを防ぐという利点もあります)、ディレクトリがサブドメインにマップされているかどうかの曖昧さを回避するために良い方法です。たとえば、「dev」サブドメインのルートの次のパスを検討してください: /var/www/example.com/subdomains/dev/www。これにより、開発サイトのログを個別に管理することもできます (例: /var/www/example.com/subdomains/dev/logs)。

以下の例では、pma サブドメインをテンプレートとして使用し、サブドメインのルートをメイン サイトの下に保持します。

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

}

上記のアイデアは、すべてのサブドメインが同じテンプレートに従う場合にのみ実際に機能します。投稿した構成では、pma サブドメインと dev サブドメインは大幅に異なります (dev サブドメインには、pma サブドメインにはない多くの書き換えがあります)。使用している「テンプレート」に従わないサブドメインには、独自のサーバー ブロックと構成が必要です。2 つのサーバー ブロックが適用可能な場合 (たとえば、1 つは静的 server_name で、もう 1 つは正規表現 server_name の場合)、静的 server_name が優先されることに注意してください。

関連情報