Comment puis-je retourner un état 503 dans Apache sans invoquer de scripts externes

26

Je dois renvoyer un code d'état 503 depuis l'un de mes sites pendant qu'il est en panne pour maintenance, de la manière séculaire SE_firendly. Je n'arrive pas à trouver comment faire cela sans invoquer des scripts externes, ce que je préfère éviter.

Existe-t-il une directive apache qui me permettra de renvoyer un code d'état HTTP arbitraire sans recourir à des hacks comme invoquer un script php qui définit l'en-tête d'état?

dan mackinlay
la source
2
Je ne suis pas sûr que l'exécution d'un fichier PHP soit considéré comme un "hack" ... c'est en quelque sorte exactement ce qu'un serveur Web est conçu pour faire ...
Mark Henderson
3
Hm. Je pense que l'invocation d'un langage de script interprété entier pour définir une seule ligne de la réponse du serveur peut être considérée comme un hack. La définition de lignes d'en-têtes de réponse sans solutions de contournement élaborées me semble plus proche de ce que les serveurs Web ont été conçus pour faire.
dan mackinlay

Réponses:

32

Cela sert à chaque demande une page d'attente statique avec le statut 503.

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

RedirectMatch est utilisé pour annuler la page de garde elle-même, ce qui sinon créerait une boucle infinie.

mod_header est utilisé pour définir un en-tête Retry-After afin que vous puissiez dire à Google / autres bots, etc. que vous devez sauvegarder après 18000 secondes (5 heures) dans cet exemple. Vous pouvez sudo ap2enmod headeractiver mod_header (qui est requis pour la directive Header).

recherche de muffins
la source
2
+1: Un commentaire secondaire: vous ne pouvez ajouter que les règles [RedirectMatch 503. *] Et [En-tête toujours définir une nouvelle tentative après "18000"] et cela fonctionne avec le message d'erreur 503 par défaut. Recherchez le fichier conf.d / localized-error-pages pour définir un message différent pour différentes langues (celles-ci nécessitent des modules de négociation, d'alias et d'inclusion).
lepe
Ça marche! Pour mon site Web personnel, j'utilise RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Essayer

Redirect 503 / /

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

D'autres codes d'état peuvent être renvoyés en donnant le code d'état numérique comme valeur d'état. Si l'état est compris entre 300 et 399, l'argument URL doit être présent, sinon il doit être omis. Notez que l'état doit être connu du code Apache (voir la fonction send_error_response dans http_protocol.c).

Remarque supplémentaire: Cela affichera le document d'erreur par défaut / configuré pour l'erreur 503.

David Pashley
la source
Merci David. mod_alias n'est pas là où je m'attendais à trouver cette réponse, mais il semble faire le travail.
dan mackinlay
ouais, Redirect n'est pas vraiment le bon verbe pour ce que vous faites :)
David Pashley
Rediriger 503 il manque un argument, URL-path, qui est toujours obligatoire. L'URL en revanche doit être omise si le code redirigé n'est pas 300-399
1
J'obtiens une erreur en faisant cela: "La redirection prend deux ou trois arguments, un statut optionnel, puis le document à rediriger et l'URL de destination", pouvez-vous donner un exemple plus complet en contexte?
Tom
4
Redirect 503 /semble fonctionner.
mpartel
0

Pour rendre votre mode de maintenance plus flexible, définissez 503 lorsqu'un fichier spécial existe, ala:

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

REMARQUE: l'emplacement de DOCUMENT_ROOT peut différer entre httpd 2.2 et 2.4

De cette façon, tout ce que vous devez faire est de "toucher /path/to/docroot/.maintenance" et votre site commencera instantanément à renvoyer des 503. Ensuite, pour tout faire, créez une page d'erreur html bien formatée et ajoutez-la au fichier de configuration du serveur apache correct:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Et pour les points bonus si vous avez plusieurs serveurs Web, faites l'emplacement de .maintenance sur un système de fichiers partagé, ou pour encore plus de points bonus:

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

L'avantage de créer le fichier du mode de maintenance est qu'il fonctionne lorsque votre application ne fonctionne pas, c'est simple et rapide, et il est plus facile à gérer pour un proxy de mise en cache frontal car vous pouvez gérer tous les backends 503 d'un seul coup.

Sources:

Phil
la source