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