ラック
Home > ブログ > 記事 > 2018年7月 > Apacheで存在しない仮想サイトを指定すると意図しないサイトが表示される

Apacheで存在しない仮想サイトを指定すると意図しないサイトが表示される

カテゴリ: サーバ

Apache使いの間では割と知られた話ではあると思うのですが、今回自分も嵌まったので。

遭遇した現象

ApacheのVirtualHost機能を使って、1つのマシンで

  • www.example.com
  • test.example.com
  • hoge.example.com

のように、複数のサイトを建てたとします。

このとき、上に列挙された名前でサーバにアクセスした場合は、当然該当する名前の仮想サイトが応答してくれます。では、上に列挙されていない名前(例えばfuga.example.com)でこのサーバにアクセスしようとするとどうなるか。

普通に404などを返してくれれば良いのですが、Apacheはなぜか「最初のVirtualHost(詳しくは後述)」で応答を返すようです。結果、test.example.com/wordpress/でこのサーバにアクセスした場合、例えばhoge.example.comの404ページが返ってくる、というような意図しないページを返すことがあるのです(実際テストサーバでhostsファイルで名前解決するようにしていたら返されてしまった)。

最初のVirtualHost

ちなみに、「最初のVirtualHost」はApacheの設定によって挙動が変わるようです。

例えば、VirtualHostごとに/etc/httpd/vhostsディレクトリの中に設定ファイルが存在する場合は、アルファベットの最も若い順番(上記の3つのサイトだとhoge.example.com)が応答するようです。

一方、すべて/etc/httpd/conf/httpd.confの中に列挙する設定ですと、一番上の行に書かれたサイトが応答するようです。

今回の自分のテストサーバでは後者の設定方法で、


NameVirtualHost *:80
<VirtualHost www.example.com:80>
  ServerName www.example.com
  DocumentRoot /var/www/www/public
  <Directory /var/www/www/public>
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost test.example.com:80>
  ServerName test.example.com
  DocumentRoot /var/www/test/public
  <Directory /var/www/hoge/public>
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost hoge.example.com:80>
  ServerName hoge.example.com
  DocumentRoot /var/www/hoge/public
  <Directory /var/www/hoge/public>
    Allow from all
  </Directory>
</VirtualHost>

というような内容だったため、test.example.com/wordpress/でアクセスした際に、一番上のwww.example.comの404ページが返ってきた、という状態です。

対処

よそのサイトが見えるのは気持ち悪いので、1つ新しく適当なVirtualHostを作り、それを一番上の行に持ってきました。そして、そのルートディレクトリに差しさわりの内容のhtmlを設置し、404ページの指定もしておくことで、よそのサイトが見える現象を防ぐことにしました。


NameVirtualHost *:80
## piyo.example.comを追加し、差しさわりのないファイルを設置
<VirtualHost piyo.example.com:80>
  ServerName piyo.example.com
  DocumentRoot /var/www/piyo/public
  <Directory /var/www/piyo/public>
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost www.example.com:80>
  ServerName www.example.com
  DocumentRoot /var/www/www/public
  <Directory /var/www/www/public>
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost test.example.com:80>
  ServerName test.example.com
  DocumentRoot /var/www/test/public
  <Directory /var/www/hoge/public>
    Allow from all
  </Directory>
</VirtualHost>

<VirtualHost hoge.example.com:80>
  ServerName hoge.example.com
  DocumentRoot /var/www/hoge/public
  <Directory /var/www/hoge/public>
    Allow from all
  </Directory>
</VirtualHost>

ちなみに、/etc/httpd/vhostsの中に各VirtualHostの設定ファイルがある場合は、1.confのようなアルファベットが最も若くなるような設定ファイルを作っておけば回避できるようです。

参考

タグ: サーバ環境・構築,トラブル対処

 



関連する記事一覧