Date de publication: le mardi 28 août 2007 à 10h10
Dernière modification: par Pascal BOYER le dimanche 6 janvier 2008 à 22h22
« Article précédent: Apache 2 : installer le module mod_deflate
Voici le document dont je me suis inspiré pour écrire cet article: askapache.com
Créer une page de maintenance
Lorsque l'on doit, par exemple, mettre à jour son site eZ Publish vers une nouvelle version, il est important de présenter aux visiteurs une page les informant de la raison de l'indisponibilité momentanée du site et les priant de bien vouloir revenir dans quelques temps.
Pour un site eZ Publish de plusieurs milliers d'objets, la mise à jour prend environ une demi-heure... si vous avez, bien sûr, suivi cette règle d'or .
Cependant, il ne faut pas négliger les effets que pourrait avoir, sur les robots des moteurs de recherche, un arrêt temporaire du site et surtout de l'impact du code HTTP envoyé à ces robots par un site inaccessible. En effet, mieux vaut éviter que notre site soit malencontreusement désindexé par google...
Le protocole HTTP possède toute une série de codes , chacun ayant une signification bien précise, dont se servent, entre autres, les robots dans leur tâche d'indexation des pages.
Le code HTTP 503
Ce code est particulièrement approprié à la situation qui nous préoccupe, à savoir la maintenance d'un site. Voici ce qu'en dit la page du Centre d'aide Administrateur de google:
503 (Service non disponible) Le serveur est temporairement indisponible (il est surchargé ou en cours de maintenance). En général, cette situation est passagère.
Nous allons donc nous attacher à présenter aux robotx de google un code 503 et aux visiteurs un message, disons... plus humain !
Vous adapterez le code si vous souhaitez ajouter les robots des autres moteurs de recherche.
Le fichier .htaccess
On commence par créer un fichier .htaccess que l'on place à la racine du répertoire d'installation de son site (ou, par exemple de eZ Publish) et dans lequel on écrit le code ci-après (le code est expliqué par les commentaires insérés):
vi .htaccess
#La directive Options n'est pas obligatoire et indique ici que le serveur est autorisé à suivre les liens
# symboliques dans le répertoire où est placé le fichier .htaccess
Options +FollowSymLinks
#La directive RewriteEngine sert à activer le module de réécriture des URI
#En commentant cette ligne on désactive la redirection
RewriteEngine On
#La directive RewriteBase: voir le lien ci-dessous
RewriteBase /
# ============ POUR LES ROBOTS ============
#
#Cette directive RewriteCond définit la première condition de réécriture d'URI. Ici elle indique:
# pour tout robot dont l'identifiant contient une des valeurs définies par la ligne (en clair, pour tous
# les robots de google)
RewriteCond %{HTTP_USER_AGENT} ^.*(Googlebot|Googlebot|Mediapartners|Adsbot|Feedfetcher)-?(Google|Image)? [NC]
#Cette directive RewriteCond définit la deuxième condition de réécriture d'URI. Ici elle indique:
# pour toutes les pages demandées, sauf /cgi-bin/503.php
# Le drapeau [NC] signifie "No Case" c'est à dire "Insensible à la casse"
RewriteCond %{REQUEST_URI} !^/cgi-bin/503.php [NC]
#La directive RewriteRule définit la règle de réécriture (il faut que les deux conditions définies ci-dessus
# soient réunies pour qu'elle s'applique).
# Ici, la syntaxe indique qu'il faut substituer tout URI demandé par /cgi-bin/503.php
# IMPORTANT: le chemin vers le fichier 503.php doit être identique au chemin défini dans la deuxième condition.
# Sinon, c'est le message d'erreur assuré !
RewriteRule .* /cgi-bin/503.php
# ============ POUR LES VISITEURS ============
#
# Cette directive RewriteCond définit la première condition de réécriture d'URI. Ici elle indique:
# quelle que soit l'@IP de provenance de la requête, sauf pour l'@ 82.67.66.131 (celle de la machine à partir
# de laquelle vous effectuez la maintenance du site)
RewriteCond %{REMOTE_ADDR} !^82\.67\.66\.131
# Cette directive RewriteCond définit la deuxième condition de réécriture d'URI. Ici elle indique:
# pour toutes les pages demandées, sauf /cgi-bin/404.php
RewriteCond %{REQUEST_URI} !^/maintenance.html [NC]
#La directive RewriteRule définit la règle de réécriture (il faut que les deux conditions définies
# ci-dessus soient réunies pour qu'elle s'applique). Ici, la syntaxe indique qu'il faut substituer tout URI demandé
# par l'affichage de la page maintenance.html
# Le drapeau R (R pour Redirect = Redirection) définit le code de redirection. 302 signifie une redirection temporaire.
# Le deuxième drapeau, L, veut dire Last (dernier). On indique ainsi qu'il s'agit de la dernière règle que l'on
# souhaite appliquer.
# IMPORTANT: le chemin vers le fichier maintenance.html doit être identique au chemin défini dans la deuxième condition.
# Sinon, c'est le message d'erreur assuré !
RewriteRule .* /maintenance.html [R=302,L]
- Documentation de la directive RewriteBase
Le script 503.php
Une fois le fichier .htaccess en place, il faut créer le script PHP destiné aux robots. Ce script doit contenir le code définissant une Réponse HTTP , c'est à dire un message envoyé par un serveur à destination des navigateurs clients (l'inverse étant une demande HTTP ):
vi 503.php
<?php
/* On bufferise le texte html ci-dessous avant de l'envoyer */
ob_start();
/* On définit la version utilisée du protocole HTTP et le code statut (ici 503) HTTP à envoyer */
header("HTTP/1.1 503 Service Temporarily Unavailable");
/* Cette ligne est nécessaire si PHP s'exécute en mode CGI (voir ci-dessous) */
header("Status: 503 Service Temporarily Unavailable");
/* On indique au robots de repasser dans 3600 secondes */
header("Retry-After: 3600");
/* ??? */
header("X-Powered-By");
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Temporarily Unavailable</title>
</head><body>
<h1>Service Temporarily Unavailable</h1>
<p>The server is temporarily unable to service your
request due to maintenance downtime or capacity
problems. Please try again later.</p>
</body></html>
- Documentation de la fonction ob_start(): manuelphp.com
- Documentation de la fonction ob_start(): fr.php.net (à lire avec attention car beaucoup d'indications précieuses sur l'utilisation et les pièges de la fonction header() et ob_start() )
:
Si vous utilisez une version CGI de PHP, alors l'en-tête header('Status: 503 Ser...) est requis en plus de l'entête header(' HTTP/1.1 503 ...). Par contre, si vous utilisez le module mod_php alors l'en-tête header('Status: 503 Ser...) n'est pas nécessaire .
Pour savoir le mode d'exécution de PHP, reportez-vous à ce paragraphe: Quel SAPI est installé
Emplacement du script 503.php
L'emplacement de ce script est définit dans le fichier de configuration httpd.conf du serveur Apache. Ce fichier doit contenir une section semblable à celle-ci:
<IfModule mod_alias.c>
Alias /cgi-bin* /usr/local/lib/cgi-bin/
<Directory "/usr/local/lib/cgi-bin/">
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
#Options ExecCGI +Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>
C'est donc dans le répertoire /usr/local/lib/cgi-bin/ que sera placé le fichier 503.php
Si à la place de la directive Alias il y a la directive ScriptAlias alors un URI de ce type:
http://www.luxpopuli.fr/cgi-bin/503.php
...renverra systématiquement un message d'erreur:
Message d'erreur engendré par la directive ScriptAlias et le script 503.php
Ce message est engendré car le script 503.php n'est pas un script CGI. Pour vous convaincre, qu'en fait, votre configuration est correcte, placez le script ci-dessous dans le répertoire définit par la directive ScriptAlias:
vi /usr/local/lib/cgi-bin/test.cgi
#!/usr/bin/perl
print "Content-type: text/html\r\n\r\n";
print "Si je vois ce texte, alors c'est que tout fonctionne normalement ;-)";
Puis rendez le script exécutable:
chmod o+x /usr/local/lib/cgi-bin/test.cgi
L'accès au script renvoie ceci:
Avec un vrai script CGI la directive ScriptAlias affiche correctement le contenu du script
De tout cela on retiendra donc qu'il faut, dans notre présent cas, utiliser la directive Alias et non ScriptAlias.
Par ailleurs, pour qu'un URI du type:
http://www.luxpopuli.fr/cgi-bin/
...n'affiche le contenu du répertoire défini par la directive Alias, il ne faut pas utiliser l'option +Indexes du paramètre Options et bien écrire Alias /cgi-bin*
Pour le mode VirtualHost sous eZ Publish
Dans la déclaration du mode VistualHost , on trouve cette section:
<Directory /usr/local/www>
Options FollowSymLinks
AllowOverride None
</Directory>
Pour que la redirection fonctionne, il faut tout d'abord, modifier ainsi la valeur du deuxième paramètre:
<Directory /usr/local/www>
Options FollowSymLinks
AllowOverride All
</Directory>
:
Dans le code ci-dessus, la directive
AllowOverride
définit si oui ou non (en l'occurrence non - None), un fichier .htaccess situé à la racine du répertoire définit par la directive <Directory > peut surcharger les droits définis par les directives du fichiers httpd.conf.
C'est pour cela qu'il faut impérativement que la valeur de cette directive soit All
Ensuite, toujours dans la partie qui déclare le mode VirtualHost, il faut ajouter deux règles de réécriture :
RewriteRule ^/cgi-bin - [L] RewriteRule ^/maintenance.html - [L]
Sans ces deux règles, l'accès aux fichiers à afficher, 503.php et maintenance.html, est impossible et toute tentative engendre une erreur du noyau de eZ Publish.
Le fichier maintenance.html
C'est la dernière étape.
Ce fichier doit simplement contenir le message d'information que vous destinez aux visiteurs de votre site. Une fois ce fichier placé à la racine de votre site (comme indiqué par la directive RewriteRule de votre fichier .htaccess), vous devriez être le seul à pouvoir accéder à votre site et tous les autres visiteurs seront redirigés vers http://www.votre_site.com/maintenance.html
Ressources
La réécriture d'URI:
Le fichier .htaccess:
- Des exemples de règles à placer dans le fichier .htaccess: exemple de règles
Sécurité:
- Un article expliquant comment snifer le réseau sans être vu: Sniffing on ethernet undetected
HTTP:
- La RFC 2616 en français sur le protocole HTTP/1.1: RFC-2616.html
Commentaires














