Назад | Перейти на главную страницу

Это хорошая практика для создания поддоменов

Я пытаюсь создать поддомены с помощью своего веб-приложения, однако у меня нет большого опыта работы с 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;
    }
}

Если вы ищете автоматические поддомены, основанные на стандартном шаблоне (например, поддомен для каждого пользователя), вы можете использовать захват регулярных выражений в своей директиве server_name. Этот подход позволит вам назначить часть server_name переменной для использования в другом месте вашей конфигурации (например, для установки пути).

Как правило, рекомендуется размещать «настоящие» поддомены над корневым веб-сайтом, чтобы лучше разделить сайты (и это имеет то преимущество, что предотвращает доступ через основной сайт), а также для предотвращения двусмысленности относительно того, соответствует ли каталог каталогу поддомен или нет. Например, рассмотрите следующий путь для корня вашего поддомена 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). Любые поддомены, которые не соответствуют используемому вами «шаблону», будут нуждаться в собственном блоке сервера и конфигурации. Стоит отметить, что в случае применения двух блоков server (например, одного со статическим server_name и одного с регулярным выражением server_name) статическое server_name будет иметь приоритет.