SSIで読み込むファイルが入ったディレクトリへの直接アクセスを禁止したいと思った時にハマって、そして解決したのでメモ。
設定例
/_ssi/ というディレクトリにSSI用のファイルがあって、ここへの直接アクセスを禁止したい。
失敗例
.htaccess
に以下のように単純に書くと失敗します。
RewriteEngine on
RewriteRule ^/?_ssi/ - [F]
確認のために http://example.com/_ssi/ へ直接アクセスしてみると全て 403 Forbidden になって出来たー。と思うのもつかの間、実はこれだとSSIのinclude読み込みまでも拒否してしまうので全然駄目です…orz
成功例
SSIでの読み込みか直接アクセスなのかを区別したいときには%{IS_SUBREQ}
というのが使えます。これはそのリクエストが通常のリクエストなのかhttpd内部でのサブリクエストかどうかを判定する為のRewriteCondで使える特殊変数で、trueかfalseが入っています。
RewriteEngine on
RewriteCond %{IS_SUBREQ} =false
RewriteRule ^/?_ssi/ - [F]
なので、こんな感じの設定をしてやれば「SSIでは読み込めるけど直接アクセスは禁止」が実現できるってわけですす。