Le header Retry-After
L’arme secrète de votre SEO en maintenance
Une ligne de configuration qui fait toute la différence pour Google.
Pourquoi ce header est crucial
Quand votre site renvoie une erreur 503, Google se pose une question simple : « Je reviens quand ? »
Sans indication, Googlebot utilise son propre algorithme : il revient dans quelques minutes, puis quelques heures, puis quelques jours… et finit par considérer vos pages comme potentiellement mortes.
Avec le header Retry-After, vous lui dites exactement quand revenir. Il respecte cette consigne et reprend son crawl normalement dès la fin de la maintenance.
❌ Sans Retry-After
HTTP/1.1 503 Service Unavailable
Content-Type: text/html
- Google revient aléatoirement
- Risque de ralentissement du crawl
- Désindexation possible après 48-72h
✅ Avec Retry-After
HTTP/1.1 503 Service Unavailable
Retry-After: 3600
Content-Type: text/html
- Google sait qu’il doit attendre 1h
- Aucun impact sur le budget crawl
- Reprise normale après maintenance
Les deux formats acceptés
Le header Retry-After accepte deux syntaxes selon la RFC 7231 :
Format 1 : Nombre de secondes (recommandé)
Délai en secondes
Retry-After: 3600
| Valeur | Durée |
|---|---|
300 | 5 minutes |
1800 | 30 minutes |
3600 | 1 heure |
7200 | 2 heures |
21600 | 6 heures |
86400 | 24 heures |
Recommandation : Utilisez le format en secondes. Plus simple, pas de problème de fuseau horaire, et universellement supporté.
Format 2 : Date HTTP absolue
Date absolue
Retry-After: Sat, 14 Dec 2024 15:30:00 GMT
Attention au format exact : jour abrégé, date, heure en GMT uniquement. Une erreur de syntaxe et le header est ignoré.
Configuration par serveur
Apache (.htaccess)
.htaccess
# Maintenance mode avec Retry-After
RewriteEngine On
# Exclure votre IP pour continuer à travailler
RewriteCond %{REMOTE_ADDR} !^123.456.789.012$
# Exclure les fichiers statiques
RewriteCond %{REQUEST_URI} !.(css|js|png|jpg|gif|ico|svg|woff2?)$
# Rediriger tout vers la page maintenance
RewriteCond %{REQUEST_URI} !^/maintenance.html$
RewriteRule ^(.*)$ /maintenance.html [R=503,L]
# Header Retry-After (1 heure)
Header always set Retry-After "3600"
Le module mod_headers doit être activé. Vérifiez avec a]apachectl -M | grep headers.
Nginx
/etc/nginx/sites-available/monsite.conf
server {
listen 80;
server_name monsite.com;
# Mode maintenance activé
set $maintenance 1;
# Exclure votre IP
if ($remote_addr = "123.456.789.012") {
set $maintenance 0;
}
# Retourner 503 avec Retry-After
if ($maintenance = 1) {
return 503;
}
# Page d'erreur personnalisée
error_page 503 @maintenance;
location @maintenance {
add_header Retry-After 3600 always;
root /var/www/html;
rewrite ^(.*)$ /maintenance.html break;
}
# Configuration normale...
}
PHP (toutes plateformes)
maintenance.php
<?php
// Vérifier si maintenance activée
$maintenance_mode = true; // ou lire depuis un fichier/BDD
if ($maintenance_mode) {
// Exclure certaines IPs
$allowed_ips = ['123.456.789.012', '98.76.54.321'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) {
// Envoyer les headers AVANT tout output
http_response_code(503);
header('Retry-After: 3600');
header('Content-Type: text/html; charset=UTF-8');
// Afficher la page maintenance
include 'maintenance.html';
exit;
}
}
// Suite du code normal...
Ordre critique : Les headers doivent être envoyés AVANT tout contenu HTML, même un espace ou un BOM. Sinon PHP génère une erreur « headers already sent ».
Configuration par CMS
WordPress
.maintenance ou functions.php
<?php
// Méthode 1 : Fichier .maintenance à la racine
// WordPress l'affiche automatiquement mais SANS Retry-After
// Méthode 2 : Dans functions.php (recommandé)
function custom_maintenance_mode() {
if (file_exists(ABSPATH . '.maintenance-custom')) {
// Laisser passer les admins
if (current_user_can('administrator')) {
return;
}
http_response_code(503);
header('Retry-After: 3600');
wp_die(
'<h1>Maintenance en cours</h1>
<p>Nous revenons très vite !</p>',
'Maintenance',
['response' => 503]
);
}
}
add_action('init', 'custom_maintenance_mode', 1);
Les plugins comme « WP Maintenance Mode » ou « Coming Soon » n’envoient pas toujours le header Retry-After. Vérifiez avec curl -I ou utilisez notre Status Checker.
Besoin d’aide pour configurer WordPress ? WPHelp247 intervient en urgence.
PrestaShop
config/defines.inc.php
<?php
// PrestaShop gère la maintenance nativement
// Mais le Retry-After n'est pas inclus par défaut
// Ajouter dans /override/classes/controller/FrontController.php
class FrontController extends FrontControllerCore
{
public function initContent()
{
if ((bool) Configuration::get('PS_SHOP_ENABLE') === false) {
// Vérifier IP autorisée
$allowed = Configuration::get('PS_MAINTENANCE_IP');
if (!in_array(Tools::getRemoteAddr(), explode(',', $allowed))) {
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 3600');
}
}
parent::initContent();
}
}
Après modification, videz le cache PrestaShop. Pour les migrations complexes, IllicoPresta assure un accompagnement complet.
Quelle durée indiquer ?
Le Retry-After doit refléter la réalité. Quelques repères :
| Type de maintenance | Durée typique | Retry-After suggéré |
|---|---|---|
| Mise à jour mineure (plugin, module) | 5-15 min | 900 (15 min) |
| Mise à jour majeure CMS | 30 min – 1h | 3600 (1h) |
| Migration de thème | 1-2h | 7200 (2h) |
| Migration serveur | 2-6h | 21600 (6h) |
| Migration base de données volumineuse | 4-12h | 43200 (12h) |
Règle d’or : Surestimez légèrement. Mieux vaut annoncer 2h et terminer en 1h30 que l’inverse. Un Retry-After trop court qui n’est pas respecté envoie un signal négatif.
Astuce : Mettez à jour dynamiquement le Retry-After si vous connaissez l’heure de fin. Un script peut calculer les secondes restantes :
$end_time = strtotime('2024-12-14 16:00:00');
$retry_after = max(60, $end_time - time());
header("Retry-After: $retry_after");
Vérifier que ça fonctionne
Ne faites jamais confiance à votre configuration sans la tester. Voici comment :
En ligne de commande
$ curl -I https://votresite.com
HTTP/1.1 503 Service Unavailable
Date: Sat, 14 Dec 2024 10:30:00 GMT
Server: nginx/1.24.0
Retry-After: 3600 # ✅ Présent !
Content-Type: text/html
$ # Vérifier la valeur
$ curl -sI https://votresite.com | grep -i retry-after
Retry-After: 3600
Avec notre outil
Notre Status Checker vérifie automatiquement la présence et la validité du header Retry-After. Il vous alerte si :
- Le header est absent
- La syntaxe est incorrecte
- La valeur semble incohérente (ex: 30 jours)
Erreurs fréquentes à éviter
Header envoyé trop tard
<!DOCTYPE html>
<?php
// ERREUR : HTML avant header
header('Retry-After: 3600');
Le header est ignoré car du contenu a déjà été envoyé. Toujours placer les headers en tout premier.
Mauvais format de date
Retry-After: 14/12/2024 15:30:00
Retry-After: 2024-12-14T15:30:00Z
Seuls le format secondes ou HTTP-date (RFC 7231) sont valides. Les formats ISO 8601 ne fonctionnent pas.
Retry-After avec code 200
http_response_code(200); // Oubli du 503
header('Retry-After: 3600');
Le Retry-After n’a de sens qu’avec un code 503 (ou 429, 301). Avec un 200, il est ignoré.
Valeur irréaliste
Retry-After: 604800
7 jours en maintenance ? Google risque de désindexer bien avant. Limitez-vous à 24h max, ou découpez votre maintenance.
Générez votre configuration en 30 secondes
Sélectionnez votre serveur, indiquez la durée, copiez le code.
Questions fréquentes
Le Retry-After est-il obligatoire pour une 503 ?
Non, il est optionnel selon la RFC. Mais il est fortement recommandé pour le SEO. Sans lui, Google utilise son propre algorithme de retry qui peut être défavorable à votre site, surtout si la maintenance se prolonge.
Google respecte-t-il vraiment le Retry-After ?
Oui, Google a confirmé officiellement qu’il respecte ce header. Googlebot attendra le délai indiqué avant de retenter. C’est documenté dans les guidelines Google Search Central.
Puis-je utiliser Retry-After avec d’autres codes HTTP ?
Oui, le header est également valide avec :
- 429 Too Many Requests : Rate limiting
- 301 Moved Permanently : Redirection (rare)
- 503 Service Unavailable : Maintenance (usage principal)
Que se passe-t-il si ma maintenance dure plus longtemps que prévu ?
Google reviendra à l’heure indiquée et recevra une nouvelle 503 (idéalement avec un nouveau Retry-After). Ce n’est pas idéal mais pas catastrophique. Le vrai problème survient si vous annoncez 1h et que la maintenance dure 3 jours.