RewriteRule ^(.*)$ [F]って書いたのに、403 Forbiddenじゃなくて400 Bad Requestが返ってくるのはなぜ?
ある条件に当てはまるリクエストが来たら、403 Forbiddenを返したい!と思って、RewriteRuleを調べてたらこんなの出てきた。
mod_rewriteでアクセス拒否? | Life is Real.
「おおー、[F](=[forbidden])なんてあるんだー」と思ってこう書いた。
RewriteEngine On RewriteCond 「こういう条件に当てはまったら」という条件文 RewriteRule ^(.*)$ [F]
そしたら何故かRewriteRule ^.*$ [F]でアクセスしたら、「400 Bad Request」になりまし... - Yahoo!知恵袋とまったく同じ状態になった。えー、403 Forbiddenじゃなくて400 Bad Requestが返ってくるのはなんでー?
と思ったら答えはやっぱりApache公式にあったよ。
mod_rewrite - Apache HTTP Server Version 2.2
403じゃなくて400が返ってきたのは何故か?何故ならば、書式ルール的には「RewriteRule Pattern Substitution [flags]」って書くべきなのに、真ん中のSubstitution(置換後の文字列) をすっ飛ばして「RewriteRule ^(.*)$ [F]」って書いてたからでした。Patternとflagsしかなかったんだね。
mod_rewrite - Apache HTTP Server Version 2.2にちゃんと
- (dash) A dash indicates that no substitution should be performed (the existing path is passed through untouched). This is used when a flag (see below) needs to be applied without changing the path.
と書いてあるので、「RewriteRule ^(.*)$ - [F]」が正解でした。チーン。(要は「置換とかしないならハイフン使え」と書いてある)
RewriteEngine On RewriteCond 「こういう条件に当てはまったら」という条件文 RewriteRule ^(.*)$ - [F]
これならちゃんと403が返ってきたよー!わー!