apacheのvirtualhostの設定でservernameが一致しなかったときの挙動

apacheのvirtualhostの設定でservernameが一致しなかったときの挙動について思った通りの挙動ではなかったので修正した。

apacheのコンフィグファイルの中にホスト名ごとにDocumentRootなどを変えるvirtual hostの機能がある。これはとても便利なんだけれど、思った通りの挙動ではなかったので調べてみた。

FreeBSDではportsからapacheをインストールするとそのコンフィグファイルは /usr/local/etc/apache22に置かれる。

その中の extra/httpd-vhosts.conf にvirtualhostの設定が書いてある。デフォルトコンフィグがあるのでそれを参照しながら書いたりしてる。これを使うとホスト名での環境の変更、ポート番号ごとによる変更などが可能になる。
virtualhostは参照されたホスト名によってコンフィグを切り替えるので、アクセスされたホスト名を示す ServerName によって切り分ける。
具体的には下記の例。

<VirtualHost *:80>
DocumentRoot /usr/local/www/www1.example.com
ServerName www1.example.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /usr/local/www/www2.example.com
ServerName www2.example.com
</VirtualHost>

この設定であればwww1.example.comなホスト名でアクセスすると /usr/local/www/www1.example.com のファイルが参照される。
www2.example.com でアクセスすれば /usr/local/www/www1.example.com が参照される。
ここで www3.example.com でアクセスされるとこのコンフィグには設定が存在しない。
この設定の上位には元を設定するための httpd.conf があって、そちらの設定が適用されるのかと思ってた。だけどどうやら違うらしく、httpd-vhosts.conf の最上部が適用されるらしい。
つまりこの例であれば /usr/local/www/www1.example.com が表示されるということに。
これだと思ってたより違う感じで困ってしまうので、そのような場合のためにServerNameが一致しないときのDcoumentRootを設定しておく。
設定のやりかたは簡単でServerNameを記述しないディレクティブを一つ置いておけば良い。

# servernameが一致しなかった時用
<VirtualHost *:80>
DocumentRoot /usr/local/www/apache22/data
</VirtualHost>

これでServerNameが合わなかった時の設定に合致するので変なホスト名の設定がひょじされることはなくなった。

めでたしめでたし。

コメントを残す