web-dev-qa-db-ja.com

これはサブドメインを作成するための良い習慣ですか

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

標準テンプレート(すべてのユーザーのサブドメインなど)に基づいて自動サブドメインを探している場合は、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が優先されることに注意してください。

1
cyberx86