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
ValeurDurée
3005 minutes
180030 minutes
36001 heure
72002 heures
216006 heures
8640024 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 maintenanceDurée typiqueRetry-After suggéré
Mise à jour mineure (plugin, module)5-15 min900 (15 min)
Mise à jour majeure CMS30 min – 1h3600 (1h)
Migration de thème1-2h7200 (2h)
Migration serveur2-6h21600 (6h)
Migration base de données volumineuse4-12h43200 (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.