メンテナンスのためにダウンしているサイトの1つから503ステータスコードを、昔ながらのSE_firendly方式で返す必要があります。外部スクリプトを呼び出さずにこれを行う方法を考え出すことはできませんが、避けたいと思います。
ステータスヘッダーを設定するphpスクリプトを呼び出すようなハッキングに頼らずに、任意のHTTPステータスコードを返すことができるApacheディレクティブはありますか?
メンテナンスのためにダウンしているサイトの1つから503ステータスコードを、昔ながらのSE_firendly方式で返す必要があります。外部スクリプトを呼び出さずにこれを行う方法を考え出すことはできませんが、避けたいと思います。
ステータスヘッダーを設定するphpスクリプトを呼び出すようなハッキングに頼らずに、任意のHTTPステータスコードを返すことができるApacheディレクティブはありますか?
回答:
これは、503ステータスとともにすべてのリクエストに静的な保留ページを提供します。
RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"
RedirectMatchは、保持ページ自体を無効にするために使用されます。それ以外の場合は無限ループを作成します。
mod_headerを使用してRetry-Afterヘッダーを設定すると、この例では18000秒(5時間)後にバックアップする必要があることをGoogle /他のボットなどに伝えることができます。sudo ap2enmod header
mod_headerをアクティブにすることができます(これはHeaderディレクティブに必要です)。
RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg)
。
試してみる
Redirect 503 / /
http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirectから:
ステータスの値として数値のステータスコードを指定すると、他のステータスコードを返すことができます。ステータスが300〜399の場合、URL引数が存在する必要があります。存在しない場合は省略されます。ステータスはApacheコードに認識されている必要があることに注意してください(http_protocol.cの関数send_error_responseを参照)。
追加の注:これにより、503エラーのデフォルト/設定済みErrorDocumentが表示されます。
Redirect 503 /
動作するようです。
メンテナンスモードをより柔軟にするには、特別なファイルが存在する場合に503を設定します。ala:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]
注:DOCUMENT_ROOTの場所は、httpd 2.2と2.4で異なる場合があります
この方法で行う必要があるのは「touch /path/to/docroot/.maintenance」だけで、サイトはすぐに503を返し始めます。次に、すべてをきれいにするために、適切にフォーマットされたカスタムHTMLエラーページを作成し、これを正しいapacheサーバーの設定ファイルに追加します。
ProxyErrorOverride on
ErrorDocument 503 /error/503.html
また、ボーナスポイントの場合、複数のWebサーバーがある場合は、共有ファイルシステムで.maintenanceの場所を作成するか、さらにボーナスポイントを取得します。
pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"
メンテナンスモードファイルをベースにする利点は、アプリケーションが動作しなくても動作すること、迅速かつ簡単であること、すべてのバックエンド503を一気に処理できるため、フロントエンドキャッシングプロキシが処理しやすいことです。
ソース: