1. Top
  2. » Linux
  3. » ApacheのVirtualHostで存在しないホストに404を返す

ApacheのVirtualHostで存在しないホストに404を返す

VirtualHost ずっと使ってたのに最近まで知らなかったのでメモ。


ApacheのVirtualHost機能を使って、1つのマシンで
www.example.com
blog.example.com
bbs.example.com
みたいに複数のWebサイトを建ててるとする。
さて、すると上記のサイトにももちろんアクセスはあるが、一方
test.example.com とか nonexistent.example.com などの、
自分では設定してないホスト名へのアクセスも来たとしよう。
こういうリクエストに対しては 404 を返したいな、と考えたとする。
どうすればよいか。

適当にggったバーチャルホストの説明ページによれば、自分では設定してないホスト名へのアクセスの処理は
(...) つまり、リクエストが どの ServerName ディレクティブにもマッチしない場合、 一番最初の VirtualHost により扱われます。 (httpd.apache.org)
とある。つまり、1つ「必ず404を返すサイト」を作って、そのダミーサイトをバーチャルホスト設定の先頭に書けば良い。

だがこの「必ず404を返すサイト」の作り方でなぜか手こずってしまった。
例えば
<VirtualHost *:80>
ServerName dummy # ServerNameは適当で良い
DocumentRoot /var/www # 適当なパス、index.htmlなどは置かない
</VirtualHost>
のように単純にただ何もないサイトを作った場合、404 (Not Found) ではなく 403 (Permission Denied) を返してしまう。

次にちょっとひねって
<VirtualHost *:80>
ServerName dummy #
DocumentRoot /var/dummy # 存在しないパス
</VirtualHost>
のように DocumentRoot に存在しないパスを書いてみると、DocumentRootが存在しないのでこれは当然 404 を返す。ただ、この設定だと毎回Apacheの起動/再起動時に「おいィ? /var/dummy など存在しないんだが?」という旨の警告が出て、少し鬱陶しい。

回りくどくなったが、結論は以下。
<VirtualHost *:80>
ServerName dummy
Redirect 404 /
</VirtualHost>
こんだけのことかー、という感じ。Redirect ディレクティブでステータスコードを返すこともできるっていうのが最大かつ唯一のポイントでした。

Comment

Comment Form
コメントの投稿
HTMLタグは使用できません
ID生成と編集に使用します
管理者にだけ表示を許可する

Page Top

Trackback

Trackback URL

http://metasta.blog88.fc2.com/tb.php/35-d50c6f0e

この記事にトラックバックする(FC2ブログユーザー)

Page Top