ジャンル不定の日記です。

バーチャルホストで想定外ドメインの接続拒否

Apacheのバーチャルホストで複数のドメインを一つのサーバーで扱うが、
その中に一つSSLのドメインがあると、ServerNameよりもportが優先されてしまうようで、
同じサーバーに向いているドメインにhttps:で接続すると、どのドメインでもSSL設定しているVirtualHostで処理されちゃうみたい。

SSLのドメインと違うので当然ブラウザに警告が出るが、Apache自体は普通に応答する。
bingとか普通のBOTがHTTPSの存在を確認するみたいで、ドメイン数が多いと結構な数のリクエストになるので解析の邪魔になる。

それを分別したいと思ったのだが、
<If "%{HTTP_HOST} != 'ssl.example.com'">
Require all denied
</If>
こんな感じでifディレクティブでHTTP_HOSTを識別すれば分別できる。
上記の場合は想定している ssl.example.com への要求以外は 403 Forbidden となる。

さらに、404 Not Found と区別したい時に 410 Gone を使っているのだが、今回のも403だとログ解析の邪魔なんで403じゃなくて410にしたい。
どうしたらできるんだ?

と調べていたが、
<If "%{HTTP_HOST} != 'ssl.example.com'">
Redirect 410 /
</If>
mod_alias の Redirect ディレクティブだが、
第一引数にステータスコードを表す数字を指定するとステータスコードを変更することができる。
基本的に3xx系の転送系のコードを指定するものだが4xxや5xxも指定できるのね。
3xx系以外のコードを指定する場合は転送先URLは省略する。
Redirectのこんな使い方知らんかった。
ちなみに、引数にgoneが定義されているので410はgoneでもいいみたい。