503 Service Unavailable : la bonne façon de passer hors ligne

503 Service Unavailable : le serveur est temporairement surchargé ou en maintenance ; c’est le code adapté à la recherche pour une interruption planifiée.

Vérifier le code d’état d’une URL

503 Service Unavailable signifie que le serveur ne peut pas traiter la requête pour le moment, parce qu’il est surchargé ou en maintenance, et qu’il compte se rétablir. C’est la façon honnête, et compatible avec la recherche, de mettre brièvement un site hors ligne.

Définition

La RFC 9110, section 15.6.4 décrit une surcharge temporaire ou une maintenance planifiée « qui sera probablement atténuée après un certain délai ». Le serveur peut envoyer un en-tête Retry-After (section 10.2.3) avec un nombre de secondes ou une date HTTP. La norme précise aussi que les serveurs ne sont pas obligés d’utiliser 503 en cas de surcharge ; certains refusent simplement les connexions.

Pourquoi 503 est le bon code pour la maintenance

Une page de maintenance servie avec 200 OK indique aux robots que « nous revenons bientôt » est votre contenu, et elle peut remplacer vos vraies pages dans l’index. Un 404 leur dit que les pages ont disparu. Un 503 dit « temporaire, revenez plus tard ».

La documentation de Google range le 503 avec les autres erreurs serveur : Googlebot ralentit, conserve un temps les URL déjà indexées et retire celles qui continuent de renvoyer des erreurs. Le 503 vous protège donc pendant de courtes pannes, pas de longues. Le guide de Google pour réduire la fréquence d’exploration présente les codes d’erreur comme un outil pour quelques heures, ou un jour ou deux. Si la maintenance doit durer plus longtemps, gardez plutôt en ligne une version du site en lecture seule.

Deux détails à bien régler :

  • Sachez ce qui arrive à robots.txt. S’il renvoie aussi 503, Google considère tout le site comme interdit jusqu’à obtenir une réponse normale. Cela met le crawl en pause pendant la panne, mais veillez à ce que robots.txt redevienne 200 dès votre retour.
  • Ne laissez pas le 503 être mis en cache. Envoyez Cache-Control: no-store pour qu’un CDN ne continue pas à le servir après votre retour.

Causes courantes de 503 imprévus

  • Des pics de trafic qui épuisent les processus PHP ou les instances de l’application.
  • Une limitation de débit qui répond 503 (limit_req de Nginx le fait par défaut ; 429 est le choix le plus clair).
  • Les modes maintenance : WordPress, par exemple, sert une page 503 « Brièvement indisponible pour cause de maintenance planifiée » (« Briefly unavailable for scheduled maintenance » en anglais) pendant une mise à jour.
  • Des répartiteurs de charge sans plus aucun serveur sain.

Comment servir un vrai 503 de maintenance

Nginx

# dans le bloc server : touch /var/www/maintenance.on pour activer,
# supprimez ce fichier pour désactiver
if (-f /var/www/maintenance.on) { return 503; }
error_page 503 @maintenance;

location @maintenance {
    root /var/www/errors;
    rewrite ^ /maintenance.html break;
    add_header Retry-After 3600 always;
    add_header Cache-Control "no-store" always;
}

Apache (.htaccess)

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/maintenance.on -f
RewriteCond %{REQUEST_URI} !^/maintenance\.html$
RewriteRule ^ - [R=503,L]
ErrorDocument 503 /maintenance.html
Header always set Retry-After "3600" "expr=%{REQUEST_STATUS} == 503"

PHP

http_response_code(503);
header('Retry-After: 3600');
header('Cache-Control: no-store');

Comment vérifier

Pendant la maintenance, passez quelques URL dans le vérificateur de statut HTTP et confirmez qu’elles renvoient 503, et non 200 ni une redirection vers une URL de maintenance. Le vérificateur d’en-têtes HTTP montre si Retry-After et Cache-Control sont bien passés.

HTTP/1.1 503 Service Unavailable
Retry-After: 3600
Cache-Control: no-store
Content-Type: text/html; charset=utf-8

Questions fréquentes

Pendant combien de temps mon site peut-il renvoyer 503 sans perdre de positions ?

Restez bref. Google traite le 503 comme temporaire, et ses consignes sur la fréquence d’exploration parlent de quelques heures ou d’un jour ou deux. Si les URL renvoient des erreurs plus longtemps, Google commence à les retirer de l’index.

Google respecte-t-il l’en-tête Retry-After ?

Google ne documente pas précisément comment il l’utilise, et Googlebot ralentit de toute façon sur tout 503. L’envoyer ne coûte rien et aide les autres clients et robots qui le respectent.

Dois-je rediriger les visiteurs vers une page de maintenance ?

Non. Servez le message de maintenance avec un statut 503 aux URL d’origine. Rediriger par un 302 vers une URL de maintenance distincte pousse les robots à la suivre jusqu’à une page en 200, ce qui va à l’encontre du but recherché.