Maintenance et mod_rewrite

Je vous l’avais promis, je vais essayé de publier plus régulièrement des billets maintenant que le site de mon association est en ligne. Alors voilà je vais vous livrer une astuce qui vous simplifiera sans doute énormément la vie.

Tout d’abord mettons nous en situation. Eric, le tableau … non c’est pas ça, je confond. Je disais donc voici le problème: vous avez un site en production et vous souhaitez le mettre à jour. Comme toute mise à jour elle va entraîner des phénomènes étranges lors de son déroulement. L’idéal serait de bloquer proprement l’accès au site pendant que vous seul pouvez y accèder afin de mettre à jour les fichiers et vérifiez que tout fonctionne comme prévu. Ca vous paraît utopique ? Pourtant c’est très facile à mettre en place. Voici comment.

La clé de cette astuce est le génial mod_rewrite, un module pour le serveur Apache. Le principe est tout bête: on interdit l’accès à toute page du site à toute IP autre que la notre.

Pour cela il suffit de créer un fichier nommé .htaccess dans le répertoire racine de votre site et d’y mettre :

RewriteEngine on RewriteCond  %{REMOTE_ADDR}  !^1\.2\.3\.4$ RewriteRule .* pages/maintenance.html [L]

Si au premier abord ces lignes semble assez cryptiques, elles sont en fait assez simples. La première active la réécriture d’URL par mod_rewrite. La seconde indique que seules les IP autres que 1.2.3.4 seront prisent en compte pour la troisième ligne qui redirige toute requête d’URL vers pages/maintenance.html. Il suffit de remplacer 1.2.3.4 par votre IP.

Quelques remarques avant de continuer. Les points séparant les parties de l’IP doivent être échappés car ils ont une signification. La commande RewriteRule prend pour premier argument une expression rationnelle (souvent appellée abusivement expression régulière à cause du faux-amis qu’est regular en Anglais) et pour second argument une URL qui sera utilisée si l’URL demandée correspond à l’expression rationnelle. Enfin le [L] indique qu’il ne faut pas continuer à tenter de réécrire l’URL. Pour plus de détails, reportez vous à la documentation officielle.

Cette méthode fonctionne très bien pour une page HTML simple mais si vous essayez d’y inclure une image vous allez avoir un problème. En effet la troisième ligne redirige toute requête vers pages/maintenance.html, y compris les requêtes pour vos images. La solution est relativement simple en fait. Il suffit de modifier le code pour obtenir ceci :

RewriteEngine on RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4$ RewriteCond %{REQUEST_URI} !^/images RewriteRule .* pages/maintenance.html [L]

La ligne supplémentaire rajoute une condition à la réécriture d’URL. Il faut à présent que l’URL demandée ne commence pas par /images. Ainsi vos requêtes vers vos images ne seront pas réécrites.

Voilà vous pouvez maintenant faire vos mises à jours tranquillement et proprement. Par contre quand vous avez terminé, n’oubliez pas de commenter ces lignes car vous aurez toujours accès au site mais pas vos visiteurs.

Ce contenu a été publié dans Développement Web. Vous pouvez le mettre en favoris avec ce permalien.

10 réponses à Maintenance et mod_rewrite

  1. Olivier dit :

    Allow From monIp
    Deny From All

    C’est pas plus simple ? (en m?me temps, c’est moins stimulant 😉

  2. JMF dit :

    Bah en fait oui c’est plus simple mais beaucoup moins ?l?gant car tes visiteurs ne savent pas pourquoi l’acc?s leur est refus? ou alors il faut g?rer une page d’erreur 401 juste le temps de la mise ? jour.

    Enfin cela ne veux pas dire que ma solution est parfaite. Si vous avez mieux je suis bien entendu preneur. 🙂

  3. Anonymus dit :

    Bonjour, comme je l’ai signal? sur le site webmaster-hub.com, l’id?e est bonne, mais il faut se m?fier des IP non fixes, telles que celles fournies par AOL, et consors. L?, le probl?me demeure.
    Pour ma part, je suis plutot du genre ? r?gler ce genre de probl?me directement en php, dans le code, avec un script du genre :

    SI maintenance & NON autorisation
    FICHIER maintenance.html
    EXIT()

    quant ? l’autorisation, il peut s’agir d’un code pass? directement dans l’url, tel que :

    http://www.monsite.tld?autorisation=TRUE

    File de discussion sur webmaster-hub :
    http://www.webmaster-hub.com/ind...

    Anonymus.

  4. JMF dit :

    Disons que ta solution est assez diff?rente de la mienne Anonymus. 🙂

    La tienne suppose qu’on utilise PHP et que l’on passe obligatoirement par un fichier unique pour naviguer sur le site.

    Avec la mienne le format de fichier n’est pas un probl?me car c’est g?r? au niveau d’Apache et cela est valable pour absolument tous les fichiers. C’est tr?s pratique quand tu utilises des outils que tu n’as pas d?velopp? comme un forum par exemple.

    Enfin le probl?me des IP non fixes n’en est pas tout ? fait un car si tu n’es pas en IP fixe, il te suffit de r?cup?rer ton IP actuelle ? l’aide d’un des tr?s nombreux outils qui permettent ?a et de mettre ? jour le fichier .htaccess avant de l’uploader sur ton site.

  5. Romain dit :

    Je sais que j’arrive toujours apr?s la bataille. :p
    J’ai utilis? ton astuce et je suis tomb? sur une erreur 500 sur mon serveur. Apr?s quelques recherches, j’ai rajout? la ligne suivante :

    RewriteBase /

    Avec cette ligne, cela fonctionne.
    Si cela peut aider. 🙂

  6. Mettre des expressions rationnelles (r?guli?res ?) ? toutes les sauces

    Lors du barbecue-php de hier, le sujet des expressions rationnelles (ou r?guli?res en franglais dans un match Google d?s?quilibr? : 3890 r?sultats contre 19400) est revenu sur le tapis. A mon sens, il s’agit l? v?ritablement d’un « cap » dans la vie d’un…

  7. songeur dit :

    RewriteRule ^$ toto.html

    si vous vouler supprimer les pages d’"index" , c’est pratique parfois …

  8. Pour choisir sa page d’index, mieux vaut utiliser la directive pr?vue pour :
    DirectoryIndex toto.html

    ?a ?vite le recours ? la r??criture qui est plus gourmande en ressources.

  9. web dit :

    Bonjour,
    une petite question: est ce que la procédure est exactement la meme pour un .conf ou pour un htaccess ?
    merci !

  10. JMF dit :

    web> Je ne sais pas ce que sont les fichiers .conf.

Les commentaires sont fermés.