web-dev-qa-db-ja.com

外部スクリプトを呼び出さずにApacheで503ステータスを返す方法

私のサイトの1つがメンテナンスのためにダウンしている間に、古くからあるSE_firendlyの方法で、503ステータスコードを返す必要があります。外部スクリプトを呼び出さずにこれを行う方法を理解することはできないので、避けたいと思います。

ステータスヘッダーを設定するphpスクリプトを呼び出すようなハックに頼らずに任意のHTTPステータスコードを返すことを可能にするApacheディレクティブはありますか?

27
dan mackinlay

これは、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ディレクティブに必要)をアクティブにします。

33
muffinresearch

試す

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が表示されます。

7
David Pashley

メンテナンスモードをより柔軟にするには、特別なファイルが存在するときに503を設定します。

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を一気に処理できるため、フロントエンドキャッシュプロキシの処理が簡単です。

出典:

1
Phil