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