バーチャルホストが多くなってくると、同じ設定を繰り返すことが無駄に思えて自動化・構造化したくなってくるのが人の情というもの。
バーチャルホストを動的に割り当てる方法には、mod_rewrite で強制的に割り当てる方法と、mod_vhost_alias を使う方法があるけれども、返す環境変数がそれぞれ異なってしまう問題がある。
http://sub.example.com を /home/exmaple.com/plublic_html/sub/ に割り当てる際のバーチャルホスト設定として、下記の3種の方法を試し、その際に返すDOCUMENT_ROOTを取得してみた。
(1) VirtualHost
<VirtualHost *>
DocumentRoot /home/example.com/public_html/sub/
ServerName sub.exmaple.com
</VirtualHost>
結果
/home/example.com/public_html/sub/
(2) mod_rewrite
<VirtualHost *>
DocumentRoot /home/example.com/public_html/
ServerName example.com
ServerAlias *.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule (.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.example\.com(.*) /home/example\.com/public_html/$1/$2 [L]
</VirtualHost>
結果
/home/example.com/public_html/
(3) mod_vhost_alias
UseCanonicalName Off
VirtualDocumentRoot /home/%2+/public_html/%1
結果
/home
以上のように、(2)または(3)の設定で、DOCUMENT_ROOTを、(1)の状態で扱うことはできない。
この不具合によって、環境変数を参照するCGIやモジュールに正常な動作は期待できない。
mod_vhost_alias のこの不具合はbugzillaで報告されているが、解消される様子はない。
https://issues.apache.org/bugzilla/show_bug.cgi?id=26052
具体的には下記のように環境変数が異なる。
■vhost
<VirtualHost *>
DocumentRoot /var/www/html/exmaple.com/public_html/
ServerName exmaple.com
</VirtualHost>
DOCUMENT_ROOT="/var/www/html/exmaple.com/public_html/sub/"
GATEWAY_INTERFACE="CGI/1.1"
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="Shift_JIS,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip,deflate"
HTTP_ACCEPT_LANGUAGE="ja,en-us;q=0.7,en;q=0.3"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="sub.exmaple.com"
HTTP_KEEP_ALIVE="300"
HTTP_REFERER="http://sub.exmaple.com/"
HTTP_USER_AGENT="Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
PATH="/bin"
QUERY_STRING=""
REMOTE_ADDR="192.168.10.2"
REMOTE_PORT="65356"
REQUEST_METHOD="GET"
REQUEST_URI="/printenv.cgi"
SCRIPT_FILENAME="/var/www/html/exmaple.com/public_html/sub/printenv.cgi"
SCRIPT_NAME="/printenv.cgi"
SERVER_ADDR="192.168.0.2"
SERVER_ADMIN="admin@exmaple.com"
SERVER_NAME="sub.exmaple.com"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.1"
SERVER_SIGNATURE=""
SERVER_SOFTWARE="Apache/2.2.14 (Unix)"
■rewrite
<VirtualHost *>
DocumentRoot /var/www/html/exmaple.com/public_html/
ServerName exmaple.com
ServerAlias *.exmaple.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule (.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.example\.com(.*) /var/www/html/example\.com/public_html/$1/$2 [L]
</VirtualHost>
DOCUMENT_ROOT="/var/www/html/exmaple.com/public_html/"
GATEWAY_INTERFACE="CGI/1.1"
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="Shift_JIS,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip,deflate"
HTTP_ACCEPT_LANGUAGE="ja,en-us;q=0.7,en;q=0.3"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="sub.exmaple.com"
HTTP_KEEP_ALIVE="300"
HTTP_REFERER="http://sub.exmaple.com/"
HTTP_USER_AGENT="Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
PATH="/bin"
QUERY_STRING=""
REMOTE_ADDR="192.168.10.2"
REMOTE_PORT="65352"
REQUEST_METHOD="GET"
REQUEST_URI="/printenv.cgi"
SCRIPT_FILENAME="/var/www/html/exmaple.com/public_html/sub/printenv.cgi"
SCRIPT_NAME="/sub/printenv.cgi"
SCRIPT_URI="http://sub.exmaple.com/printenv.cgi"
SCRIPT_URL="/printenv.cgi"
SERVER_ADDR="192.168.0.2"
SERVER_ADMIN="admin@exmaple.com"
SERVER_NAME="sub.exmaple.com"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.1"
SERVER_SIGNATURE=""
SERVER_SOFTWARE="Apache/2.2.14 (Unix)"
■mod_vhost_alias
UseCanonicalName Off
VirtualDocumentRoot /var/www/html/%2+/public_html/%1
DOCUMENT_ROOT="/var/www/html"
GATEWAY_INTERFACE="CGI/1.1"
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="Shift_JIS,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip,deflate"
HTTP_ACCEPT_LANGUAGE="ja,en-us;q=0.7,en;q=0.3"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="sub.exmaple.com"
HTTP_KEEP_ALIVE="300"
HTTP_REFERER="http://sub.exmaple.com/"
HTTP_USER_AGENT="Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
PATH="/bin"
QUERY_STRING=""
REMOTE_ADDR="192.168.10.2"
REMOTE_PORT="65512"
REQUEST_METHOD="GET"
REQUEST_URI="/printenv.cgi"
SCRIPT_FILENAME="/var/www/html/exmaple.com/public_html/sub/printenv.cgi"
SCRIPT_NAME="/printenv.cgi"
SERVER_ADDR="192.168.0.2"
SERVER_ADMIN="admin@exmaple.com"
SERVER_NAME="sub.exmaple.com"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.1"
SERVER_SIGNATURE=""
SERVER_SOFTWARE="Apache/2.2.14 (Unix)"