Bien souvent lorsque nous mettons en place un nouveau site internet, il est disponible à au moins deux adresses différentes.

Prenons un exemple : cakecoding.com acheté et hébergé chez OVH, il configuré nativement pour répondre à l’adresse cakecoding.com ou www.cakecoding.com.

Plutot que de laisser choisir les moteurs de recherche (= Google) au hasard nous allons les rediriger (les robots et nos visiteurs humains) vers le format de domaine que nous aurons choisis !

Pour ne pas perdre le positionnement éventuel des pages du domaine que nous n’avons pas retenu, toutes les “mauvaises” urls seront redirigées vers les “correctes” avec une redirection 301 dite permanente.

Il y a plusieurs façon de procéder :

  • avec PHP via la fonction header
  • avec Apache, mod_rewrite et un fichier .htaccess
  • certainement bien d’autres…

Comme la méthode PHP ne permet de couvrir que les pages générées dynamiquement en PHP justement (Adieu images référencées ou autre contenu statique !), nous allons traiter la seconde méthode qui est, à mon sens la plus élégante.

En reprenant notre exemple, ce code permet de privilégier www.cakecoding.com :

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.cakecoding\.com$
RewriteRule ^(.*) http://www.cakecoding.com/$1 [QSA,L,R=301]

Celui là permet de faire l’inverse et privilégier le nom de domaine cakecoding.com :

RewriteEngine On
RewriteCond %{HTTP_HOST} !^cakecoding\.com$
RewriteRule ^(.*) http://cakecoding.com/$1 [QSA,L,R=301]

Je ne vais pas traiter en détails les commandes utilisées car la documentation disponible en ligne est vraiment bien faite. (Apache 1.3 mod_rewrite, Apache 2 mod_rewrite).

Maintenant, comme nous sommes tous de gros paresseux, nous voulons un code réutilisable !

Voici la version “domain-free” qui fonctionnera sur n’importe lequel de vos sites sans modifications aucunes.

Ici on privilégie le www.domain.tld :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)$
RewriteRule ^(.*) http://www.%1.%2/$1 [QSA,L,R=301]

Et ici on privilégie le domain.tld :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.([^\.]+)\.([^\.]+)$
RewriteRule ^(.*) http://%1.%2/$1 [QSA,L,R=301]

Si vous avez des remarques ou des questions, je serais vraiment très heureux de les lire dans les commentaires.

[Edit] Comme le souligne Arnaud, si on veut un code portable, il est bon de tester la présence du module modrewrite sur le serveur en entourant les instructions si dessus de

<IfModule mod_rewrite.c>
(...)
</IfModule>
Tagged with:
 
About The Author

Clément

Clément est développeur Back-Office chez une société spécialiste de la veille et de l'analyse sur Internet. Quand il rentre chez lui, il passe le plus clair de son temps à chercher une formule magique pour devenir riche sur Internet entre deux projets personnels.

2 Responses to Redirection automatique www avec .htaccess

  1. Arnaud Masse says:

    La conf d’apache, c’est un truc particulièrement moche et méchant je trouve.
    Alors quand c’est bien expliqué, j’aime :)

    Sinon, j’ai juste une remarque :
    pour que ca marche, il faudra que mod_rewrite soit activé. Pour ca, il suffit de créer un lien symbolique de :
    /etc/apache2/mods-available/rewrite.c
    vers :
    /etc/apache2/mods-enabled/rewrite.c
    ou si vous etes sous debian, encore plus simple :

    # a2enmod rewrite

    Et comme ces lignes de conf sont dépendantes de la présence du module, vaut mieux l’entourer de :

    <IfModule mod_rewrite.c>
    (...)
    </IfModule>
    

    pour éviter une vilaine “internal error”

    • Clément says:

      Merci pour ce commentaire constructif. J’aime les choses proches de la perfection d’où mon edit !

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>