RewriteCond %{REQUEST_FILENAME} !-f の盲点 : してログ

RewriteCond %{REQUEST_FILENAME} !-f の盲点

Apachemod_rewrite 201313

キャッシュファイル処理などでよく使う手法で、mod_rewrite を使い実ファイルが存在していればそれを表示し、まだ作成されていなかったらスクリプトを動かしてレスポンスを返しつつファイルを保存する、という常套手段があります。それを実現するには、下記のようにしますが、少し盲点があります。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.html)$ /_system/doc.php?d=$1
RewriteRule ^(.+\.htm)$ /_system/doc.php?d=$1

一行目の指定は、実ファイルがあれば RewriteRule を適用しない、という意味になりますが、これは直後の RewriteRule にしか効かないため、三行目の指定は実ファイルがあってもスクリプトが常に動くことになります。三行目も同様にしたい場合は、下記のように書きます。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.html)$ /_system/doc.php?d=$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.htm)$ /_system/doc.php?d=$1

分かっていないと「何で~」と悩むに違いない盲点です。

2 件のコメント
foo2015-03-10 Tue 20:08
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*\.htm)(l)?$ /_system/doc.php?d=$1$2
とか。
RewriteRule ^(.*\.htm)(l)?$ /_system/doc.php?d=$0
でも行けるかも。
LANDHERE2015-03-11 Wed 18:31
>fooさん
なるほど、この場合は正規表現をまとめることができますね。
名前:
コメント: