単純な見落としでハマってしまったので自戒のために書いておく。
事象
基本的にはタイトルのまんま。
Apache 2.4 on Linux で Web サーバのプロキシを立ていて、OPTIONS メソッドのリクエストを拒否る(403 を返す)ことになった。
もともと mod_rewrite を使っていたので /etc/httpd/conf.d/myproxy.conf に
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^OPTIONS [NC]
RewriteRule ^.*$ - [F,L]
こんなのを書いて即終了だと思ったらなんかおかしな動きをした。
curl -i -X OPTIONS http://example.com → 404 (NG)
curl -i -X OPTIONS http://example.com/ → 404 (NG)
curl -i -X OPTIONS http://example.com/path → 403 (OK)
Web ルート直下にあたるパスの場合に 403 ではなく 404 が返ってきた。
正規表現とかいろいろ変えて試してみたけどダメ。
原因
/etc/httpd/conf.d/welcome.conf に以下の記述があった。
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
簡単に読み下すとこんな感じ。
- Webルートへのアクセスの場合
- ディレクトリインデックス画面は見せちゃダメ
- 403 エラーの場合は /.noindex.html を表示する
この2個めのルールのために /.noindex.html を表示しようとしたが、これに相当するパスを削除(無効化)してたためファイルが見つからないので 404 になってしまっていた。
mod_rewrite のログを LogLevel rewrite:trace8
で出して確認してるときに Web ルートに対する OPTIONS メソッド処理の後に /.noindex.html に対する GET メソッド処理が走ってるのを見つけて気づけた。
対応
welcome.conf は初期構築時の確認のための設定ファイルだと思っているのと、そこに書かれている他のルールも今回は不要だと判断したのでファイルごと削除。