Wie kann ich in Apache einen 503-Status zurückgeben, ohne externe Skripte aufzurufen?

26

Ich muss einen 503-Statuscode von einer meiner Sites zurückgeben, während die Wartung in der altbewährten SE_firendly-Form ausfällt. Ich kann nicht scheinen, um herauszufinden, wie man das macht, ohne externe Skripte aufzurufen, die ich lieber vermeiden möchte.

Gibt es eine Apache-Direktive, mit der ich einen beliebigen HTTP-Statuscode zurückgeben kann, ohne auf Hacks wie das Aufrufen eines PHP-Skripts zurückgreifen zu müssen, das den Status-Header setzt?

Dan Mackinlay
quelle
2
Ich bin mir nicht ganz sicher, ob das Ausführen einer PHP-Datei als "Hack" klassifiziert wird ... das ist genau das, wofür ein Webserver entwickelt wurde ...
Mark Henderson
3
Hm. Ich denke, das Aufrufen einer ganzen interpretierten Skriptsprache, um eine einzelne Zeile der Serverantwort festzulegen, gilt als Hack. Das Festlegen von Antwortheaderzeilen ohne aufwändige Problemumgehungen scheint mir dem näher zu sein, wofür Webserver entwickelt wurden.
Dan Mackinlay

Antworten:

32

Dies dient jeder Anfrage einer statischen Halteseite zusammen mit dem 503-Status.

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"

RedirectMatch wird verwendet, um die Halteseite selbst zu negieren, wodurch andernfalls eine Endlosschleife erstellt würde.

mod_header wird verwendet, um einen Retry-After-Header festzulegen, damit Sie Google / anderen Bots usw. mitteilen können, dass Sie in diesem Beispiel nach 18000 Sekunden (5 Stunden) eine Sicherungskopie erstellen sollen. Sie können sudo ap2enmod headermod_header aktivieren (was für die Header-Direktive erforderlich ist).

Muffinforschung
quelle
2
+1: Ein Nebenkommentar: Sie können nur [RedirectMatch 503. *] Und die [Header setze immer Retry-After "18000"] Regeln hinzufügen und es funktioniert mit der Standardfehlermeldung 503. Suchen Sie nach der Datei conf.d / localized-error-pages, um eine andere Nachricht für verschiedene Sprachen festzulegen (diese erfordern Aushandlung, Alias ​​und Include-Module).
Lepe
Es klappt! Für meine persönliche Website verwende ich RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Versuchen

Redirect 503 / /

Von http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

Andere Statuscodes können zurückgegeben werden, indem der numerische Statuscode als Statuswert angegeben wird. Wenn der Status zwischen 300 und 399 liegt, muss das URL-Argument vorhanden sein, andernfalls muss es weggelassen werden. Beachten Sie, dass der Status dem Apache-Code bekannt sein muss (siehe Funktion send_error_response in http_protocol.c).

Zusätzlicher Hinweis: Hiermit wird das standardmäßige / konfigurierte Fehlerdokument für den 503-Fehler angezeigt.

David Pashley
quelle
Danke David. mod_alias ist nicht der Ort, an dem ich diese Antwort erwartet habe, aber es scheint den Job zu erledigen.
Dan Mackinlay
Ja, Redirect ist nicht wirklich das richtige Verb für das, was Sie tun :)
David Pashley
Umleiten 503 es fehlt ein Argument, URL-Pfad, der immer obligatorisch ist. Die URL muss hingegen weggelassen werden, wenn der umgeleitete Code nicht 300-399
1
Ich erhalte dabei eine Fehlermeldung: "Die Umleitung benötigt zwei oder drei Argumente, einen optionalen Status, dann das umzuleitende Dokument und die Ziel-URL." Können Sie im Kontext ein vollständigeres Beispiel angeben?
Tom
4
Redirect 503 /scheint zu funktionieren.
Partel
0

Um Ihren Wartungsmodus flexibler zu gestalten, legen Sie 503 fest, wenn eine spezielle Datei vorhanden ist.

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]

HINWEIS: Der Speicherort von DOCUMENT_ROOT kann zwischen httpd 2.2 und 2.4 variieren

Auf diese Weise müssen Sie nur "touch /path/to/docroot/.maintenance" ausführen, und Ihre Site gibt sofort 503 zurück. Erstellen Sie anschließend eine benutzerdefinierte, gut formatierte HTML-Fehlerseite, und fügen Sie Folgendes zur Konfigurationsdatei des richtigen Apache-Servers hinzu:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Und für Bonuspunkte, wenn Sie mehrere Webserver haben, machen Sie entweder den Speicherort von .maintenance auf einem gemeinsam genutzten Dateisystem oder für noch mehr Bonuspunkte:

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

Der Vorteil der Dateibasierung im Wartungsmodus besteht darin, dass sie funktioniert, wenn Ihre Anwendung dies nicht tut. Sie ist schnell und einfach und für einen Frontend-Caching-Proxy einfacher zu handhaben, da Sie alle Backend-503-Vorgänge auf einen Schlag handhaben können.

Quellen:

Phil
quelle