Jak mogę zwrócić status 503 w Apache bez wywoływania zewnętrznych skryptów

26

Muszę zwrócić kod stanu 503 z jednej z moich stron, gdy jest on gotowy do konserwacji, zgodnie z uświęconym stylem SE_firendly. Nie potrafię wymyślić, jak to zrobić bez wywoływania zewnętrznych skryptów, których wolałbym uniknąć.

Czy istnieje dyrektywa apache, która pozwoli mi zwrócić dowolny kod statusu HTTP bez uciekania się do hacków takich jak wywoływanie skryptu php, który ustawia nagłówek statusu?

i mackinlay
źródło
2
Nie jestem do końca pewien, czy uruchomienie pliku PHP klasyfikuje się jako „hack” ... dokładnie taki jest cel serwera WWW ...
Mark Henderson
3
Hm Myślę, że wywołanie całego zinterpretowanego języka skryptowego w celu ustawienia pojedynczego wiersza odpowiedzi serwera kwalifikuje się jako hack. Wydaje mi się, że ustawienie linii nagłówków odpowiedzi bez skomplikowanych obejść jest bliższe temu, do czego zostały zaprojektowane serwery WWW.
dan mackinlay

Odpowiedzi:

32

Służy to każdemu żądaniu statyczną stronę przechowywania wraz ze statusem 503.

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

RedirectMatch służy do zanegowania samej strony wstrzymującej, która w przeciwnym razie stworzyłaby nieskończoną pętlę.

mod_header służy do ustawienia nagłówka Retry-After, dzięki czemu możesz powiedzieć Google / innym botom itp., że należy wykonać kopię zapasową po 18000 sekundach (5 godzinach) w tym przykładzie. Możesz sudo ap2enmod headeraktywować mod_header (który jest wymagany przez dyrektywę Header).

wyszukiwanie muffin
źródło
2
+1: Komentarz boczny: Możesz dodać tylko [RedirectMatch 503. *], A [Nagłówek zawsze ustawia reguły Ponawiaj po „18000”] i działa z domyślnym komunikatem o błędzie 503. Sprawdź plik conf.d / localized-error-pages, aby ustawić inny komunikat dla różnych języków (te wymagają negocjacji, aliasu i modułów).
lepe
To działa! Korzystam z mojej osobistej strony internetowej RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Próbować

Redirect 503 / /

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

Inne kody stanu można zwrócić, podając numeryczny kod stanu jako wartość statusu. Jeśli stan wynosi od 300 do 399, argument URL musi być obecny, w przeciwnym razie należy go pominąć. Zauważ, że status musi być znany kodowi Apache (patrz funkcja send_error_response w http_protocol.c).

Dodatkowa uwaga: Wyświetli domyślny / skonfigurowany dokument błędu dla błędu 503.

David Pashley
źródło
Dzięki David. mod_alias nie jest tam, gdzie spodziewałem się znaleźć tę odpowiedź, ale wydaje się, że spełnia swoje zadanie.
dan mackinlay
tak, przekierowanie nie jest tak naprawdę właściwym czasownikiem dla tego, co robisz :)
David Pashley,
Przekieruj 503 brakuje jednego argumentu, ścieżki URL, która zawsze jest obowiązkowa. Z drugiej strony adres URL musi zostać pominięty, jeśli przekierowany kod nie jest 300-399
1
Występuje błąd: „Przekierowanie wymaga dwóch lub trzech argumentów, opcjonalnego stanu, a następnie przekierowania dokumentu i docelowego adresu URL”. Czy możesz podać pełniejszy przykład w kontekście?
Tom
4
Redirect 503 /wydaje się działać.
mpartel
0

Aby uelastycznić tryb konserwacji, ustaw 503, gdy istnieje specjalny plik, między innymi:

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

UWAGA: Lokalizacja DOCUMENT_ROOT może różnić się między httpd 2.2 a 2.4

W ten sposób wszystko, co musisz zrobić, to „touch /path/to/docroot/.maintenance”, a Twoja strona natychmiast zacznie zwracać 503. Następnie, aby wszystko było nieprzyzwoite, utwórz niestandardową, ładnie sformatowaną stronę błędów HTML i dodaj ją do poprawnego pliku konfiguracyjnego serwera Apache:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

A w przypadku punktów bonusowych, jeśli masz wiele serwerów WWW, albo określ lokalizację .maintenance na współdzielonym systemie plików, albo jeszcze więcej punktów bonusowych:

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

Zaletą bazowania na pliku trybu konserwacji jest to, że działa, gdy aplikacja nie działa, jest szybka i prosta, a serwer proxy buforowania interfejsu użytkownika jest łatwiejszy do obsługi, ponieważ można obsłużyć wszystkie zaplecze 503 za jednym zamachem.

Źródła:

Phil
źródło