La problématique est donc de signaler à tous, y compris moteurs de recherche que l’on a changé d’adresse.
Je vais partir du postulat (largement vérifié chez les hébergeurs gratuits) que le serveur web est apache et que PHP est installé/activé [1].
L’opération se fait en 3 mouvements :
- transférer le site sur le nouvel hébergeur (via FTP probablement)
- vider l’ancien site
- placer sur l’ancien site les fichiers nécessaires pour signaler le changement d’adresse
Théorie du n’habite plus à l’adresse indiquée (301 Moved Permanently)
Dans sa documentation pour les webmasters, Google indique :
Si vos anciennes URL utilisent des redirections HTTP 301 (permanentes), notre robot d’exploration détectera les nouvelles URL. Pour plus d’informations sur les redirections HTTP 301, consultez la page http://www.ietf.org/rfc/rfc2616.txt (en anglais).
En français dans le texte : les normes des protocoles de communication du web (HTTP) ont prévu le cas du déménagement et Google en tient compte.
En pratique, le 301 Moved Permanently
Nous allons mettre en place 3 fichiers :
- index.php : la page par défaut du site
- .htaccess : une directive pour le serveur web apache
- erreur404.php : la page d’erreur du site pour renvoyer sur le nouveau site
Ces 3 fichiers sont à placer à la racine du site.
index.php
La page par défaut du site.
<?php
header("Status: 301 Moved Permanently", false, 301);
header("Location: http://www.pyrat.net/");
exit;
?>
Quelques lignes de PHP pour indiquer aux navigateurs et aux moteurs de recherche que la page a changé d’adresse :
- Pour les visiteurs, la redirection est absolument transparente
- Pour les moteurs de recherche, l’index est mis à jour et dans le cas de Google, le PR est transféré
.htaccess
Il s’agit d’un fichier de configuration de votre serveur web apache qui peut changer le comportement de celui-ci.
ErrorDocument 404 /erreur404.php
Cette simple ligne indique au serveur web apache que s’il ne trouve pas une page, il doit afficher à la place la page erreur404.php (le nom est arbitraire).
erreur404.php
La page d’erreur (déclarée dans le .htaccess) du site pour renvoyer sur le nouveau site.
<?php
header("Status: 301 Moved Permanently", false, 301);
// Mettre le commentaire (#) devant la ligne qui convient
header("Location: http://www.pyrat.net/".$_SERVER['REQUEST_URI']); // cas d'un serveur simplement déplacé
#header("Location: http://www.pyrat.net/"); // cas d'un serveur déplacé avec des URLs de pages différentes (par exemple, passage d'un site statique à un site SPIP
exit;
?>
Même fonctionnement que index.php à un détail près : on utilise header("Location: http://www.pyrat.net/.$_SERVER['REQUEST_URI']");
qui permet de renvoyer non plus sur la page d’accueil du nouveau site, mais sur la page demandée sur le nouveau site. Cela est à utiliser sur un site qu’on a simplement déplacé.
Si le site a été refondu dans l’opération (changement de technologie, passage d’un site statique à un site SPIP…), alors une redirection sur la page d’accueil fera l’affaire (idéalement, il faudrait établir une correspondance entre les anciennes URL et les nouvelles, mais c’est particulièrement fastidieux).
Alternative avec .htaccess seul
Situation générale
RedirectMatch permanent /.* http://www.pyrat.net/
Cette simple ligne peut être utilisée pour indiquer que toutes les pages de l’ancien site renvoient sur la page d’accueil du nouveau site.
RedirectPermanent / http://www.pyrat.net/
Permet par contre de signaler que l’ancien site a changé de nom de domaine, mais que les URL des fichiers sont transmises à l’identique.
En cas de SPIP mutualisé
En cas, de SPIP mutualisé, le .htaccess est commun à tous les sites. Il faut donc être plus spécifique :
RewriteCond %{HTTP_HOST} ^perdu\.soyezcreateurs\.net [NC]
RewriteRule ^(.*) http://www.perdu.com/$1 [R=301,L]
- La première ligne correspond au domaine que l’on souhaite rediriger
- La deuxième ligne permet de rediriger en conservant la page demandée
Et si l’URL d’origine a des paramètres ?
Remarque : ce cas est plus difficile à gérer tout simplement parce que la documentation disponible sur Internet ne présente pas d’exemples sur ce besoin.
Le besoin : un ancien site sous SPIP avec des URL compliquées avec plusieurs paramètres, et un nouveau site respectant les standards de SPIP.
Exemple (ancienne URL → Nouvelle) :
/spip/spip.php?page=pourqui&id_article=7
--> /7
De cette URL, il fallait récupérer l’identifiant de l’article.
RewriteCond %{HTTP_HOST} ^www\.domaine\.tld [NC]
RewriteCond %{QUERY_STRING} ^.*id_article=(\d+).*$ [NC]
RewriteRule ^spip\/.* http://www.domaine.tld/%1? [R=301,L]
Explications :
-
RewriteCond %{HTTP_HOST}
: pour être sûr de traiter le bon domaine - Le 2e RewriteCond fait un et logique avec le premier.
Il cherche quelque chose ayant id_article=chiffre(s)
Et met en réserve ce chiffre dans %1 - La RewriteRule n’est mise en œuvre que si c’est le sous dossier spip/
Et fait une redirection permanente vers l’identifiant trouvé
le ? final vide la query string initiale