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
Google Webmaster blog: How to deal with planned site downtime