apache2.2から2.4へのアップグレード時にmod_rewriteでハマった

More than 1 year has passed since last update.

apache2.2から2.4へアップグレードするときに、mod_rewriteの動作に違うところがあって、はまりました。


問題概要

以下がapache2.2での簡単な動作環境の概要図です。

内部サーバにプロキシしており、/へのアクセスをすべて/data/以下に集めています。

apache2.2.PNG

.htaccessに以下の内容で記載しています。

RewriteCond %{REQUEST_URI} (.*)

RewriteRule ^(.*) http://server1.internal/data/$1 [L,P,QSA]

apache2.4では同じ設定で以下の動きになります。

apache2.4.PNG

なぜか、proxy後にindex.htmlが付与されます。

パッと見、mod_dirが効いてしまっているようですが、apache2.2と2.4で動きが異なります。

2.4ではプロキシでrewriteするときに同時にindex.htmlが付与されてしまい、2.2ではついていませんでした。


対応策

先に結論を書きますと、以下の記述をすることで解決します。

DirectoryCheckHandler ON

これをapache2.4で記載すると上記の問題が解決します。


再現する環境について

apache2.4にて、mod_rewriteを設定してプロキシを行い、さらにmod_dirのモジュールがONになってDirectoryIndexに設定しているときに再現します。DirectoryIndexがindex.phpとかだったら/が/index.phpへリライトされます。

apache2.2から2.4にアップグレードしたときにこの動きになってしまっているようです。


*) mod_dir: Add DirectoryCheckHandler to allow a 2.2-like behavior, skipping

execution when a handler is already set. PR53929. [Eric Covener]

*) mod_dir: Don't search for a DirectoryIndex or DirectorySlash on a URL

that was just rewritten by mod_rewrite. PR53929. [Eric Covener]


引用元:https://www.apache.org/dist/httpd/CHANGES_2.4

まぁindex.htmlがつくのは良さそうな気もしますが。

他、tomcatとかでlocalhost:8080とかにプロキシするときにindex.htmlが勝手に付与されて見れなくなった、という現象が報告されてから急遽このオプションが追加されたっぽいです。

参考文献:https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1394403

apache2.2から2.4へアップグレードするときに念のために気を付けておいた方がよいですね。