mochikoAsTechのdig日記

当方好きなコマンドはdigです!お友達から!!よろしくお願いします!!!

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が返ってきたよー!わー!