Sur un projet de refonte pour un client e-commerce, j’ai un jour hérité d’un mode maintenance activé « à la main » par le développeur précédent : un fichier index.php à la racine affichant un message d’attente. Techniquement, la page s’affichait bien. Le problème, c’est que le serveur renvoyait un code 200 comme pour n’importe quelle page normale, et que Google avait fini par indexer ce message d’attente à la place des fiches produit.
Un vrai mode maintenance ne se contente pas de masquer le contenu : il doit répondre avec le code HTTP 503 (Service Unavailable), accompagné d’un en-tête Retry-After qui indique aux robots dans combien de temps revenir. Voici comment le faire correctement, sans extension, tout en gardant un accès normal pour les administrateurs.
Le fichier .maintenance natif de WordPress
WordPress dispose déjà d’un mécanisme intégré : lorsqu’un fichier .maintenance existe à la racine de l’installation, le cœur affiche automatiquement une page « Maintenance en cours » avec un code 503. C’est ce fichier que WordPress crée lui-même, brièvement, pendant une mise à jour automatique.
<?php
$upgrading = time();
Ce fichier minimal, déposé à la racine sous le nom .maintenance, suffit à déclencher l’écran natif. Il faut simplement penser à le supprimer une fois la maintenance terminée, sans quoi le site reste bloqué indéfiniment — un oubli classique après une intervention en urgence.
Personnaliser le message avec maintenance.php
L’écran par défaut est sommaire. En déposant un fichier wp-content/maintenance.php, on reprend totalement la main sur le rendu, tout en conservant le code 503 géré automatiquement par WordPress.

<?php
header( 'Retry-After: 3600' );
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Maintenance en cours</title>
</head>
<body>
<h1>Nous revenons très vite</h1>
<p>Le site est en maintenance programmée jusqu'à 18h00.</p>
</body>
</html>
L’en-tête Retry-After peut recevoir soit un nombre de secondes (3600 pour une heure), soit une date HTTP complète. C’est cet en-tête, combiné au code 503, qui indique clairement aux robots d’indexation qu’il s’agit d’une interruption temporaire et non d’une disparition du contenu.
Garder un accès normal pour les administrateurs
Le fichier maintenance.php natif de WordPress s’applique à tout le monde, y compris aux administrateurs connectés, ce qui complique les vérifications de dernière minute. Une alternative consiste à gérer soi-même la maintenance via le hook template_redirect, avec une exception pour les utilisateurs autorisés.
function agence_mode_maintenance() {
if ( current_user_can( 'manage_options' ) ) {
return;
}
header( 'HTTP/1.1 503 Service Unavailable' );
header( 'Retry-After: 3600' );
include get_stylesheet_directory() . '/maintenance-front.php';
exit;
}
add_action( 'template_redirect', 'agence_mode_maintenance' );
Cette approche a un inconvénient : elle s’exécute après le chargement complet de WordPress, donc plus tard que le fichier .maintenance natif, qui intervient avant même le chargement des extensions. Pour une maintenance très courte liée à une mise à jour, le fichier natif reste préférable ; pour une maintenance planifiée avec accès administrateur, le hook template_redirect est plus pratique.
Vérifier que le code HTTP est correct
Une fois la page en place, il est indispensable de vérifier concrètement le code retourné, plutôt que de se fier à l’apparence visuelle de la page.
- Avec
curl -I https://exemple.fr: la première ligne doit afficherHTTP/1.1 503. - Vérifier la présence de l’en-tête
Retry-Afterdans la même réponse. - Contrôler dans les outils de développement du navigateur, onglet réseau, qu’aucune redirection intermédiaire ne renvoie un code 200 ou 302 avant le 503.
Une maintenance qui répond 200 pendant plus de quelques heures peut faire chuter des positions patiemment construites : les moteurs de recherche finissent par traiter la page d’attente comme le nouveau contenu de référence.
Notre verdict
Le fichier .maintenance reste la solution la plus fiable pour une coupure courte, puisqu’il agit avant même le chargement de WordPress. Pour une maintenance planifiée avec accès conservé aux administrateurs, un hook sur template_redirect personnalisé prend le relais. Dans tous les cas, le code 503 et l’en-tête Retry-After ne sont pas des détails techniques secondaires : ce sont eux qui protègent le référencement pendant l’interruption.