ApacheのVirtualHost
単一のApacheに来たリクエストを、宛先のIPやドメイン名で振り分けて、あたかも別々のサーバのように見せかける機能。
- 例
- example.com でアクセス ⇒ ドキュメントルート
/var/www/html
- hoge.example.com でアクセス ⇒ ドキュメントルート
/var/www/hoge
- piyo.example.com でアクセス ⇒ ドキュメントルート
/var/www/piyopiyo
ドキュメントルートを変更する以外にも、ReDirectしたり、Optionsを設定したり、httpd.confや.htaccessでできることは基本的に設定できる。
記述場所
VirtualHostの設定は、httpd.conf(またはそこからインクルードされるファイル)に記述する必要があり、.htaccess等での設定は出来ない。
記述方法
以下のように記述する。全てのポート80宛のリクエストの内、ドメインがServerNameで指定したものに完全一致するリクエストに対し、その<VirtualHost>タグ内の設定が適用される。
<VirtualHost *:80> ServerName example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/html ErrorLog logs/example.com-error_log TransferLog logs/example.com-access_log <Directory /www/docs/> AllowOverride Indexes </Directory> </VirtualHost> <VirtualHost *:80> ServerName hoge.example.com DocumentRoot /var/www/hoge ErrorLog logs/hoge.example.com-error_log TransferLog logs/hoge.example.com-access_log </VirtualHost>
NameVirtualHost
Apache 2.2くらいまでは、NameVirtualHost [ip_addr]を指定して、ip_addr宛に来たアクセスに対してのみVirtualHostを適用する設定があった。
今でも、VirtualHostで検索するとそれを指定している説明が見られる。
しかし、2.4では使われなくなっている。($ httpd -S
でhttpd.confの構文チェックすると、将来的に消える設定である旨の警告が表示される)
デフォルトバーチャルホスト
VirtualHostを1つでも指定すると、どれにも合致しないリクエストがあった場合、1番最初に指定した<VirtualHost>の設定が適用される。これをデフォルトバーチャルホストと呼ぶ。
これは、httpd.conf内で他ファイルをIncludeした際も、Includeした順に一番最初のものが当てはまる。(おそらくワイルドカードは辞書順に読み込まれる)
よって、以下のいずれかの方法を採っておくのがよい。
- デフォルトバーチャルホストの機能自体を無効にする
- 一番最初のVirtualHostにはポータル的なWebサイト用のホストを指定する
- 一番最初のVirtualHostはダミーとして、
Deny from All
などでアクセス禁止にする
想定外のドメインからのアクセスは普通は無いと言えるが、うっかりドメイン直打ちだったりを忘れがちなので、保険のためにも注意しておく。