Top / Server / Apache / メンテナンス中のアナウンスページ
HTML convert time: 0.054 sec.

Server/Apache/メンテナンス中のアナウンスページ

Last-modified: 2012-06-28 (木) 20:26:01

目的

友人のサーバが物理的にお引越しのためアナウンスページも準備できないので、うちのサーバでアナウンスページをプチホスティングしようという試みのメモ。

要件

ユーザやクローラのことも考えて以下の要件を満たす形で設定する。

  • よくあるblogサービスとかのアナウンスページ
  • 画像もcssも使いたい
  • リダイレクトしない(ユーザエンドのURLを変えない)
  • 一時的にリソースが参照できないのでレスポンスコードは503にする
  • 応答ヘッダのRetry-Afterで終了時間を返せるようにする(.htaccessで変更可)

設定

想定するディレクトリ構成、503.htmlにおける注意事項、httpd.confの記述、.htaccessの記述の順で進めていきます。

ディレクトリ構成

ディレクトリ構成は、先頭の/をファイルシステムのルート、続く/docrootをドキュメントルートとして記述していきます。
other系は本来のコンテンツがあるイメージです。

/
└── docroot/
    ├── error/
    │   ├── 503.html
    │   └── .htaccess
    ├── otherdocs/
    └── other.html

503.html

503.htmlから参照するファイルは全て/errorディレクトリ以下に配置します。

エラーページ内では、相対パスに寄るファイル読み込みを行ってはならないので、画像やcss、JavaScriptファイル等、全てのリソースを絶対パスで参照する必要があります。また、cssでの画像参照等、読み込んだファイルでの参照も絶対パスで記述します。

これは、レスポンスコード503を発行した階層でエラーページが読み込まれるため、階層毎に相対パスが書き換わってしまうためです。

httpd.conf

基本的な設定は省略し、ここでの目的に必要な箇所だけを記述します。

エラーページの指定

エラーコードに対応するページを、ドキュメントルートからのパスで指定します。

ErrorDocument 503 /error/503.html

RerwiteRule

ステータスコード503を返し、アナウンスページを使用するためmod_rewriteを使用します。
書き換えルールは「/error/ 以下へのアクセス以外はURLを書き換えずにレスポンスコードを503に指定する。」になっています。

その後、レスポンスコードに合わせたエラーページの読み込みで、指定したエラーコード用のファイルがクライアントに転送されます。
ここで/error/にあるドキュメントのリクエストでループしないため、上記の書き換えルールになっています。

RewriteEngine on

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

.htaccessによる応答ヘッダの書き換え

.htaccessでHeaderディレクティブを使用できる様にDirectoryセクションを追加する。
ドキュメントルートではなく、/docroot/errorを指定します。

また、ドキュメントルートでFileInfoのオーバーライドが許可されている場合は、以下の記述をする必要はありません。

<Directory /docroot/error>
    AllowOverride FileInfo
</Directory>

.htaccess

HTTPの応答ヘッダ内、Retry-Afterフィールドを書き換えます。

Retry-Afterフィールドは、リトライまで空けて欲しい時間を秒数で指定するか、絶対時をGMTで指定します。
今回はメンテナンス中の事なので、メンテナンスの終了予定時間に合わせて設定します。

時刻のフォーマットは、RFC2616[外部リンク]のセクション「3.3.1 Full Date」に詳細な定義が有ります。
基本的には以下の書式を真似て変更すれば問題ないはずです。

Header set Retry-After "Fri, 31 Dec 2012 23:59:59 GMT"

確認

最後に確認して設定を完了しましょう。確認方法の一例を挙げておきます。

アナウンスページ

実際にWEBページにアクセスし、URLが書き換わらずにアナウンスページが表示されれば完了です。念のため、ディレクトリ階層が違うURLを参照してそちらも確認してみてください。

レスポンスコードとRetry-After

こちらはHTTPヘッダを見る必要があります。Firefoxであれば、「メニュー>ツール>Web開発>Webコンソール」から確認できます。

503.png

Webコンソールに表示された503レスポンスを選択すると、ヘッダ内のフィールドを確認することが出来ます。

retry-after.png

以上、お疲れ様でした。