Comment le code est écrit
Le générateur écrit des règles mod_rewrite, le module de réécriture d'Apache, pour un fichier .htaccess placé à la racine du site. Chaque redirection est une règle, précédée au besoin de conditions :
RewriteEngine OnRewriteCond %{HTTP_HOST} ^exemple\.fr$ [NC]RewriteRule ^ancienne-page\.html$ /nouvelle-page/ [R=301,L]- Le motif d'une règle est une expression régulière : le point, qui veut dire « n'importe quel caractère », est échappé en
\., comme? + * ( ) [ ] { } | ^ $. - Dans un .htaccess, ce motif porte sur le chemin sans la barre oblique de tête : un motif qui commence par
^/n'y correspond jamais, erreur classique des codes recopiés d'une configuration de serveur. - Le chemin est comparé décodé : une ancienne adresse saisie avec
%C3%A9donne un motif avec « é ». Apache réencode lui-même la nouvelle adresse au moment de rediriger, c'est pourquoi le générateur l'écrit décodée : un%déjà présent serait encodé une seconde fois. [NC]ignore la casse du nom de domaine ;[L]arrête la lecture des règles.
L'ordre du fichier est choisi pour éviter les chaînes : ancien domaine, puis pages déplacées (vers l'adresse définitive, HTTPS et www compris), puis HTTPS et www pour tout le reste. Une page visitée en http:// arrive donc en une seule redirection.
301 ou 302
| Code | Sens | Quand |
|---|---|---|
| 301 | Définitif | Nouveau domaine, passage en HTTPS, page renommée |
| 302 | Temporaire | Maintenance, page provisoire, essai |
La RFC 9110 de l'IETF, qui définit HTTP, autorise un navigateur à garder une 301 en cache : une erreur de redirection permanente peut continuer à s'appliquer chez vos visiteurs après sa correction. D'où l'habitude de tester en 302, puis de passer en 301 une fois tout vérifié.
Trois exemples
http://exemple.fr/contact part en une seule fois vers https://www.exemple.fr/contact. Les adresses déjà en https://www. ne sont pas redirigées.
Avec ancien-site.fr vers https://www.exemple.fr, l'adresse http://www.ancien-site.fr/blog/?page=2 devient https://www.exemple.fr/blog/?page=2 : chemin et paramètres suivent.
La ligne /ancienne-page.html /nouvelle-page/ donne la règle RewriteRule ^ancienne-page\.html$ https://www.exemple.fr/nouvelle-page/ [R=301,L] quand HTTPS et www sont forcés : une seule redirection, même depuis http://exemple.fr/ancienne-page.html.
Pages avec paramètres
Une règle ne voit jamais la partie qui suit le ?. Pour rediriger /produit.php?id=12, le générateur ajoute une condition sur les paramètres, comparés à l'identique :
RewriteCond %{QUERY_STRING} =id=12RewriteRule ^produit\.php$ /boutique/chaise/ [R=301,L,QSD]Par défaut, Apache recopie les paramètres d'origine sur la nouvelle adresse quand elle n'en a pas : sans [QSD], on arriverait sur /boutique/chaise/?id=12. Le drapeau les retire. Pour une page sans paramètres, ceux de la visite (une campagne, par exemple) sont gardés.
Les pièges à éviter
Apache relit le fichier à chaque page demandée : une directive mal écrite ou refusée par le serveur suffit à renvoyer une erreur sur tout le dossier, le détail se lisant dans le journal d'erreurs. Gardez une copie de l'ancien fichier, essayez le code sur une préproduction ou une copie du site, puis testez quelques adresses (avec et sans www, en http et https, avec des paramètres) avant la mise en ligne.
- Boucle derrière un proxy ou un CDN : si le HTTPS s'arrête au proxy, Apache reçoit la visite en HTTP et la variable HTTPS n'y vaut jamais « on ». Cochez l'option du proxy : la condition lit alors l'en-tête
X-Forwarded-Proto, comme dans la recette de la documentation d'Apache. - Certificat qui ne se renouvelle plus : la vérification d'un certificat par le protocole ACME (Let's Encrypt, par exemple) peut passer par
/.well-known/acme-challenge/en HTTP. L'option dédiée laisse ces adresses en HTTP, comme la recette de la documentation d'Apache. - Module et droits : mod_rewrite doit être actif, et le serveur doit autoriser ces directives dans un .htaccess (réglage AllowOverride, et option FollowSymLinks ou SymLinksIfOwnerMatch). Sinon, le fichier est ignoré ou provoque une erreur : demandez à votre hébergeur.
Questions fréquentes
Où placer le fichier .htaccess ?
À la racine du site, dans le dossier qui contient la page d'accueil. Le code généré suppose cet emplacement : dans un sous-dossier, les chemins des règles seraient relatifs à ce dossier.
Quelle différence entre une redirection 301 et 302 ?
La 301 annonce un déplacement définitif, la 302 un déplacement temporaire. Pour un changement d'adresse durable (nouveau domaine, passage en HTTPS, page renommée), on utilise la 301.
Pourquoi mon site affiche-t-il une erreur de redirections en boucle ?
Souvent parce que le HTTPS est géré par un proxy ou un CDN qui contacte le serveur en HTTP : Apache voit toujours une connexion non chiffrée et redirige sans fin. Cochez l'option du proxy, qui lit l'en-tête X-Forwarded-Proto à la place.
Faut-il écrire RewriteEngine On à chaque bloc ?
Non, une fois en tête du fichier suffit. Si votre .htaccess en contient déjà un (WordPress, par exemple), placez les règles de redirection avant les autres règles de réécriture.
Le code fonctionne-t-il sur Nginx ?
Non. Le .htaccess est propre à Apache (et aux serveurs compatibles). Nginx a sa propre syntaxe, dans la configuration du serveur.
Une erreur ? Signalez-la, nous la corrigeons.