昔Apache 2.0系で試したときは無理だったのに、2.2系ではできるようになっていたのか。
mod_rewriteで503 – Do You PHP はてな
上エントリーで引用されているドキュメントは古くて、現在は次のような記述に置き換わっている。
While this is typically used for redirects, any valid status code can be given here. If the status code is outside the redirect range (300-399), then the Substitution string is dropped and rewriting is stopped as if the L flag was used.
『このフラグは通常リダイレクトのために用いられるが、任意の妥当なステータスコードを指定することができる。もしリダイレクト以外のステータスコード(すなわち300〜399以外)が指定された場合、置換文字列は無視され、さらにLフラグが指定されたときと同じようにURLの書き換えが停止される。』
つまりリダイレクトもURLの書き換えも行われないので、デフォルトのエラー画面以外を表示するには ErrorDocument ディレクティブで指定しておく必要がある。
RewriteEngine On RewriteCond %{some_condition} =1 RewriteRule .* - [R=503] ErrorDocument 503 /server_is_busy.html
ソースに付属している文書(CHANGES)によれば、この仕様に変わったのはバージョン2.1.1。Bugzillaで以下のような議論も見つけた。
In the <300, >=400 cases, one can think of this as [R{esponse}=nnn} as opposed to [R{edirect}], and it really harms nothing to overload it.Bug 45478 – R flag in RewriteRule does not honor 400 and 500 range error code
Redirect の ‘R’ ではなく Response の ‘R’ と見なしてくれ、と。なるほど…。
mod_rewriteでメンテナンスページを表示する…
メンテナンス中画面を出す正しい作法と.htaccessの書き方 | Web担当者Forum を読みました。
Webアプリを運用していると、サービスのメンテなどでメンテナンス画面を表示しないといけない…