対応レスポンスコードがApache バージョンによって違うがために、Webサイトメンテナンス画面を出すための .htaccess でハマったのを解決♪

スポンサードリンク

こちらを参考に、サイトのどのページにアクセスされても、メンテナンスページを表示するよう .htaccess ファイルを編集しておりましたけれども、ハマってしまいました。

解決いたしましたのでメモです♪

  • mod_rewrite の R フラグのレスポンスコード指定を削除した。
  • つまり、[R=503,L] → [R,L] でエラー解消した♪
  • [R=503,L] のときは URL は同じで置換されなかったが、[R,L] のときは URL がメンテナンスページの URL へと書き換わった
  • Apache のバージョンが 2.0.64 の環境で起きた。参考ページのバージョンは2.2。これが原因!

対応レスポンスコードは Apache 2.0 なら 300 〜 400 が指定可能で、Apache 2.2 以降はすべてが指定可能

原因を探るべくドキュメントをあさりましたら、確かにございました!ポイントは次です。

  • Apache 2.0 の場合、[R=300,L] 〜 [R=400,L] が可能
  • Apache 2.2 以降の場合、任意でありなんでも、[R=503,L] はもちろん、可能
  • Apache 2.2 以降は加えて、レスポンスコード 300 〜 399 以外の場合、URL は元のままで、書き換えが行われない。そのため、エラー画面の表示にデフォルト以外のページを使用するには ErrorDocument ディレクティブで指定が必要

まずはバージョン 2.0 です。指定はできるのですけれども、Apache 2.0 で指定できるステータスコードは 300 〜 400 限定です。

If you want to use other response codes in the range 300-400, simply specify the appropriate number or use one of the following symbolic names: temp (default), permanentseeother.

mod_rewrite – Apache HTTP Server ← バージョン 2.0

★日本語訳★

300 から 400 までの他のレスポンスコードを返したい場合は、 直接その番号を指定するか、シンボル名 temp (デフォルト), permanent, seeother のいずれかを使います。』

続いて、バージョン 2.2 です。今度はステータスコード 300 〜 399 以外を指定してください、というのが Apache 2.2 以降です。バージョン 2.4 も確認しましたけれども、同じでございました。

Any valid HTTP response status code may be specified, using the syntax [R=305], with a 302 status code being used by default if none is specified. The status code specified need not necessarily be a redirect (3xx) status code. However, if a status code is outside the redirect range (300-399) then the substitution string is dropped entirely, and rewriting is stopped as if the L were used.

RewriteRule Flags – Apache HTTP Server ← バージョン 2.2

★日本語訳★

任意の有効なHTTPレスポンスコードを指定することができ、もし何も指定しない場合は [R=305]、デフォルトで使用されている302ステータスコードを使います。指定されるステータスコードは必ずしもリダイレクト(3xx)のステータスコードである必要はありません。しかし、ステータスコードがリダイレクト範囲外である場合(つまり 300 〜 399 以外)は、置換文字列は完全に無視され、さらに L フラグを使用したときと同じように、URL 書き換えは停止される。』

はい、スッキリしました♪

この修正に気がつくために Apache のエラーログが参考になりました♪

修正する際、闇雲にいじりましても効果は低いです。ログにエラー内容が記述されていました。

  • ログの場所 → /var/log/httpd/error_log
  • 一回のリクエストで複数行のエラーが表示された。次で示す例の ‘R’ 部分で切れて終わる行が大半だった
  • [Thu Oct 14 21:04:30 2013] [alert] [client 192.168.56.111] /var/www/html/.htaccess: RewriteRule: invalid HTTP response code for flag ‘R’, refere: http://example.com

結局、正しい作法でメンテナンス中ページを出すための Apache 2.0 の場合での .htaccess はこのように書きました!

  • 書き換え後 URL を「-」← 元のまま変更しない、から「/maintenance.html」← メンテナンスページ、へ修正
  • [R=503,L] → [R,L] へ修正
ErrorDocument 503 /maintenance.html

RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ /maintenance.html [R,L]

もし、Apache 2.2 以降であれば次のように、参考ページと同様で問題ありません。なお、参考ページは <IfModule mod_rewrite.c> で囲っておりますけれども、なくとも動きましたので省略しておりますの。

ErrorDocument 503 /maintenance.html

RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ - [R=503,L]

おわりに

mod_rewrite は文法が難解です><。難しいです><。日本語ドキュメント古いです><。今回、ドキュメントの古い部分を鵜呑みにしていたら解決できませんでした><。ドキュメントを読むことのできる英語力か、もしくは余裕と時間が必要ですこと。切に感じました。

なんとか解決出来ましてホッと胸をなでおろしておりますの。助けになったページはこちらでございます。実践した結果から、己の正しさはわかっているのに、英語の理解が至らずに不安が解消できないところを救っていただきました。ありがとう存じます!

そして、Apache 2.1.1 からなのですね。R フラグに指定できるレスポンスコードが任意になりましたのって。


スポンサードリンク

コメントを残す