# Un mode maintenance propre sans extension, avec le bon code HTTP

> Un mode maintenance mal fait renvoie un code 200 sur une page vide : Google indexe le message d'attente. Voici comment répondre 503 correctement.

- Auteur : Clément Hadrot
- Publié le : 2020-06-24
- Mis à jour le : 2020-06-24
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/mode-maintenance-code-http-503/

## L’essentiel

- Le code 503 empêche le référencement de la page d'attente
- Retry-After indique aux robots quand revenir
- Les administrateurs gardent un accès normal

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.

> L'essentiel à retenir : Le code 503 empêche le référencement de la page d'attente ; Retry-After indique aux robots quand revenir ; Les administrateurs gardent un accès normal

```
<?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 afficher `HTTP/1.1 503`.
- Vérifier la présence de l'en-tête `Retry-After` dans 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.
