Le mode maintenance

L’activation du mode maintenance d’un site web est souvent motivé par une mise en place d’une page d’attente pour les internautes afin que les administrateurs du site puissent intervenir tranquillement de leur coté pour par exemple mettre à jour le site web. Dans ce contexte c’est une action volontaire d’afficher la page.

Voyons ensemble les bonnes pratiques a adopter pour ne pas se retrouver avec par exemple sa page de maintenance indexé par les moteurs de recherche.

Dans l’idéal la page devrait :

  • retourner le code HTTP « 503 »
  • indiquer aux robots de ne pas suivre et indexer la page
  • indiquer aux clients (robots, navigateurs…) un délai d’attente avant de refaire une demande
  • ne pas être mise en cache

 

Donne moi ton « 503 »

Dans le virtualhost d’Apache ou encore dans le « .htaccess » :

# Si le module de réécriture d'URL existe
<IfModule mod_rewrite.c>
# Lancement du module de réécriture d'URL
RewriteEngine on
# Vérification de la présence du fichier "maintenance.html" à la racine du site
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
# Exclusion de la redirection le fichier "maintenance.html" (sinon on va boucler)
RewriteCond %{SCRIPT_FILENAME} !maintenance.html 
# On redirige tout le monde vers la page "maintenance.html" présent à la racine du site et on spécifie le code 503 (R=503) et on arrête le processus de réécriture (L) 
RewriteRule ^.*$ /maintenance.html [R=503,L]
</IfModule>

Oui mais comment je fais pour tester mon site web ?!?

# Si le module de réécriture d'URL existe
<IfModule mod_rewrite.c>
# Lancement du module de réécriture d'URL
RewriteEngine on
# Exclusion de mon IP
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX
# Vérification de la présence du fichier "maintenance.html" à la racine du site
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
# Exclusion de la redirection le fichier "maintenance.html" (sinon on va boucler)
RewriteCond %{SCRIPT_FILENAME} !maintenance.html 
# On redirige tout le monde vers la page "maintenance.html" présent à la racine du site et on spécifie le code 503 (R=503) et on arrête le processus de réécriture (L) 
RewriteRule ^.*$ /maintenance.html [R=503,L]
</IfModule>

Cela permet d’ajouter une exclusion pour votre adresse IP.

 

Bloquer l’exploration et l’indexation

La balise meta robots est à positionner entre les balises head de votre page :

<meta name="robots" content="noindex, nofollow">

Ceinture et bretelle avec l’entête HTTP « X-Robots-Tag » actuellement supporté par Google et Yahoo! (oui çà existe encore en 2017)

<IfModule mod_headers.c>
<Files "maintenance.html">
Header set X-Robots-Tag "noindex, nofollow"
</Files>
</IfModule>

 

Reviens me voir plus tard !

Le paramètre header « Retry-After » indique combien de temps l’agent utilisateur devrait attendre avant de faire une demande de suivi. (réf : Retry-After)

Il est peut être utilisé dans le cas d’un code http « 503 » et permet d’indiquer soit une une date de fin de la mise en maintenance soit au bout de combien temps il doit attendre avant de refaire une requête.
Certains crawlers et spiders comme Googlebot prennent en compte le header « Retry-After ».

Exemples :

# paramètre avec une date de type HTTP-date (réf : RFC 2616 - Full Date) :
Header set Retry-After "Wed, 21 Oct 2015 07:28:00 GMT"
# paramètre en secondes :
Header set Retry-After "3600"

Si vous ne savez combien de temps pourra prendre votre intervention alors je vous conseil de mettre la configuration suivante :

<IfModule mod_headers.c>
<Files "maintenance.html">
# 5 minutes :
Header set Retry-After "300"
</Files>
</IfModule>

 

Et le cache dans tout ça ?

Désactiver la mise en cache de la page « maintenance.html » : dans le virtualhost d’Apache ou encore dans le « .htaccess » :

<IfModule mod_headers.c>
<Files "maintenance.html">
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</Files>
</IfModule>

Cette configuration permet de ne pas mettre en cache la page pour tous les types de clients, y compris ceux qui supporte uniquement HTTP/1.0

 

On fait l’bilan calmement en s’remémorant chaque instant

En pré-requis vous avez besoin des modules apache suivants :

  • mod_headers
  • mod_rewrite

Voici la configuration finale :

<IfModule mod_rewrite.c>
RewriteEngine on
# Exclusion de mon IP
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html 
RewriteRule ^.*$ /maintenance.html [R=503,L]
</IfModule>
<IfModule mod_headers.c> 
<Files "maintenance.html">
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
Header set X-Robots-Tag "noindex, nofollow"
Header set Retry-After "300"
</Files>
</IfModule>

Personnellement je conseil de rendre autonome la page « maintenance.html » :

  • encoder les images en base64  (https://www.base64-image.de)
  • inclure les javascripts et css dans le corps de la page
  • ne pas utiliser de police spécifique

A noter que si vous laissez votre page de maintenance activée au-delà d’1 semaine, vous aurez de forte chance pour que Google et company index quant même votre site web avec votre page de maintenance.

Notre page de maintenance : https://www.nooby.fr/maintenance.html

Activation du mode maintenance et petite trace afin de vérifier les header HTTP :

HTTP/1.1 503 Service Temporarily Unavailable
Date: Mon, 31 Jul 2017 14:29:14 GMT
Server: Apache
Accept-Ranges: bytes
Vary: Accept-Encoding
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
X-Robots-Tag: noindex, nofollow
Retry-After: 300
Content-Length: 551
Content-Type: text/html
X-IPLB-Instance: 343
Connection: Keep-Alive
Content-Encoding: gzip
Set-Cookie: 720plan=R1791020527; path=/; expires=Mon, 31-Jul-2017 15:49:32 GMT
Age: 0

Références :

RFC7231 – 503 Service Unavailable

RFC7234 – Hypertext Transfer Protocol (HTTP/1.1): Caching

RFC 7231 – Retry-After

Google Webmaster blog: How to deal with planned site downtime

Cache-Control

En-tête HTTP X-Robots-Tag

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.