mod_vhost_alias が普及しない理由
バーチャルホストが多くなってくると、同じ設定を繰り返すことが無駄に思えて自動化・構造化したくなってくるのが人の情というもの。
バーチャルホストを動的に割り当てる方法には、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)"
コメントはまだありません。