質問: お世話になります。 現在管理しているサイトは、 例えば `http://example.com/files/content` というリクエストに対し、.htaccessにて、 ``` RewriteRule ^files/([0-9A-Za-z_)]+)$ $1.php [QSA,L] ``` という形で、 content.phpを表示するようにしています。 しかし、現在の設定では、 `http://example.com/content.php` でアクセスしても、同じファイルが表示されます。 apacheのアクセスログを見ますと、botなのか、直接 .phpで終わるリクエストのログが時々見られるため、できれば指定したphpファイル以外は、指定したURL以外の方法では開けないようにしたいと思っています。 例えば、a.phpとb.phpを許可するファイルとして、 `http://example.com/a.php` `http://example.com/b.php` でリクエストしても開けるが、 その他の`http://example.com/content.php`というような「.php」を含むリクエスト対して、error.htmlを表示させたいと思い、 ``` RewriteRule ^files/([0-9A-Za-z_)]+)$ $1.php [QSA,L] RewriteCond %{REQUEST_URI} !a.php$ RewriteCond %{REQUEST_URI} !b.php$ RewriteRule ^([0-9A-Za-z_)]+).php$ error.html [L] ``` このようにしたところ、 a.php、b.phpでは開くことが出来ますが、 肝心の `http://example.com/files/content` でもerror.htmlが表示されるようになってしまいます。 どのように書けばよいか、ご助言をお願い致します。 よろしくお願いします。
回答: L|last フラグは httpd.conf で設定した場合はそこで停止しますが、.htaccess で設定した場合は書き換え後の URL がもう一度、最初のルールから解析されるようです。 RewriteRule Flags:L|last Apache httpd 2.4 の場合は [L] の代わりに [END] を利用することができます。 RewriteRule Flags:END Apache httpd 2.2 以前の場合は httpd.conf に設定するしかないと思います。