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 などでアクセス禁止にする

想定外のドメインからのアクセスは普通は無いと言えるが、うっかりドメイン直打ちだったりを忘れがちなので、保険のためにも注意しておく。

programming/web_development/apache/virtualhost.txt · 最終更新: 2019/02/13 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0