Remplacer une query string par une autre dans .htaccess

Nouveau WRInaute
Bonjour, je ne suis pas un pro des sites web mais je possède un site que je gère seul et sans CMS.

Je voudrais faire une redirection permanente de l'adresse https://www.chateauxlozere.fr/_chateaux.php?chateau=010-06-LhermDAuroux vers l'adresse https://www.chateauxlozere.fr/_chateaux.php?chateau=010-06-HermL
En fait, j'ai changé le nom d'un dossier et l'ancienne adresse, qui n'existe plus, est toujours référencée par Google et débouche sur une page d'erreur.
J'aimerais donc tomber sur la bonne adresse quand on entre l'ancienne dans le navigateur.
Je ne parviens pas à écrire les règles correctement dans mon fichier .htaccess (je suis tout à fait débutant en la matière)
Le fichier .htaccess se trouve à la racine de mon site

Si quelqu'un sait comment je dois faire, je suis preneur. J'ai trouvé beaucoup de topics sur des forums pour supprimer ce qui est après le ? mais rien pour remplacer ce qui se trouve après le ?

Merci et bonne soirée.
 
Nouveau WRInaute
Voici le code de mon fichier .htaccess :
Code:
RewriteEngine on
Redirect 301 /p99_liste.php https://www.chateauxlozere.fr
RewriteCond %{HTTP_HOST} ^chateauxlozere.fr$
RewriteRule ^(.*) http://www.chateauxlozere.fr$1 [QSA,L,R=301]
RewriteCond %{SERVER_PORT} 80
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE,QSA]
ErrorDocument 404 /page-introuvable.php
RewriteCond %{QUERY_STRING} chateau=(010-06-LHermDAuroux)
RewriteRule /_chateaux.php?chateau=%1 https://www.chateauxlozere.fr/_chateaux.php?chateau=010-06-HermL [QSA,L,R=301]

Les deux dernière lignes que j'ai écrites en essayant de comprendre ce que je trouvais sur des forums ne font rien. J'en déduis que je n'ai rien compris ;)
 
WRInaute accro
J'avais fait un truc comme ça pour un site de vacances à Porto-Vecchio :

Code:
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/_chateaux\.php\?chateau=010-06-LhermDAuroux\s [NC]
RewriteRule ^_chateaux\.php$ https://www.chateauxlozere.fr/_chateaux.php?chateau=010-06-HermL [R=301,L]

Voir si cela fonctionne, car bien souvent d'un hébergement à l'autre cela ne se passe pas de la même manière.

PS : pas fan ni des paramètres ni du PHP dans ton URL.
 
Nouveau WRInaute
J'avais fait un truc comme ça pour un site de vacances à Porto-Vecchio :

Code:
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/_chateaux\.php\?chateau=010-06-LhermDAuroux\s [NC]
RewriteRule ^_chateaux\.php$ https://www.chateauxlozere.fr/_chateaux.php?chateau=010-06-HermL [R=301,L]

Voir si cela fonctionne, car bien souvent d'un hébergement à l'autre cela ne se passe pas de la même manière.

PS : pas fan ni des paramètres ni du PHP dans ton URL.
Bonsoir, je viens d'essayer le code mais ça ne fonctionne pas.
Pour ce qui est de l'hébergement, je suis chez OVH.

Pour ce qui est des URL, je suis tout à fait d'accord avec toi, ce n'est pas très sexy et si je devais créer mon site actuellement, je le penserais tout à fait différemment.
Le souci, c'est que mes connaissances en développement web sont très limitées et que j'avais fait faire le site en php par un cousin il y a une douzaine d'années. A ce moment-là, nous n'avions aucune notion de SEO et le site n'avait pas été conçu dans l'optique du référencement.
Je commence à m'y intéresser à présent mais il y aurait beaucoup à changer et mes pages sont dans l'ensemble bien positionnées. Je ne voudrais pas perdre le bénéfice de ce référencement positif.
 
WRInaute impliqué
Juste cette page par cette autre ? pas toutes les pages qui correspondent à un motif ?
Tu devrais essayer :
Apache config:
RewriteCond %{QUERY_STRING}  ^chateau=010-06-LhermDAuroux$
RewriteRule (.*)  /_chateaux.php?chateau=010-06-HermL  [R=301,L]

Redirect, qui aurait pu sembler idéale ne permet pas d'utiliser les query. Et même pour mod_rewrite, on ne les utilise pas directement dans la RewriteRule, mais au sein d'une RewriteCond.
 
Nouveau WRInaute
Juste cette page par cette autre ? pas toutes les pages qui correspondent à un motif ?
Tu devrais essayer :
Apache config:
RewriteCond %{QUERY_STRING}  ^chateau=010-06-LhermDAuroux$
RewriteRule (.*)  /_chateaux.php?chateau=010-06-HermL  [R=301,L]

Redirect, qui aurait pu sembler idéale ne permet pas d'utiliser les query. Et même pour mod_rewrite, on ne les utilise pas directement dans la RewriteRule, mais au sein d'une RewriteCond.
Oui, juste cette page. Je ne sais pas pourquoi mais Google, alors que la page n'existe plus depuis un moment (j'ai modifié son nom) et qu'elle n'était même plus indexée, s'est remis à nouveau à l'indexer.
Ton code fonctionne très bien. Merci beaucoup pour ton aide et bon week-end !
 
Nouveau WRInaute
Juste cette page par cette autre ? pas toutes les pages qui correspondent à un motif ?
Tu devrais essayer :
Apache config:
RewriteCond %{QUERY_STRING}  ^chateau=010-06-LhermDAuroux$
RewriteRule (.*)  /_chateaux.php?chateau=010-06-HermL  [R=301,L]

Redirect, qui aurait pu sembler idéale ne permet pas d'utiliser les query. Et même pour mod_rewrite, on ne les utilise pas directement dans la RewriteRule, mais au sein d'une RewriteCond.
Ça fonctionne très bien mais comme je suis totalement novice dans ces histoires de réécriture, je ne comprends pas vraiment le fonctionnement du code.
J'aime bien comprendre ce que j'utilise, histoire de pouvoir m'améliorer.
Y a-t-il une bonne documentation, du genre "pour les nuls" ;), qui me permettrait d'apprendre et comprendre toutes ces manipulations ? Le codage est quelque chose de passionnant mais quand on débarque, on est vite largué par la quantité d'infos à emmagasiner ...
 
WRInaute impliqué
Y'a deux choses à connaître : d'une part les expressions rationnelles, ou expression régulières par transposition de l'anglais regular expression, mais bon dans la pratique ou dit regex. Tu trouveras de la doc dans trop de difficultés. Je suis toujours émerveillé pas les regex, même si quelque part, elles sont perçues comme une horreur par les dev, pas forcément à tort, mais quand même c'est beau. Tu trouveras pléthore de doc sur les regex ; https://regex101.com/, est à mon avis le meilleur outil pour tester, comprendre, s'entraîner, et même analyser une regex.

Et d'autre part la documentation d'Apache, en l’occurrence la page de doc du mod_rewrite et celle des redirections avec mod_rewrite, la liste des expressions et variables, et éventuellement la liste des drapeaux.

Ce que je propose est finalement assez simple.

La première ligne est une directive RewriteCond, si elle est satisfaite (et seulement si), la RewriteRule qui suit sera exécutée. Elle compare la variable QUERY_STRING, c'est-à-dire la chaîne de caractères des paramètres, à l'expression rationnelle ^chateau=010-06-LhermDAuroux$. Le ^ au début de la chaîne indique que la chaîne doit commencer par ce qui suit, et le $ à la fin, qu'elle doit se finir par ce qui précède ; avec les deux, c'est la chaîne de paramètres en entier qui doit correspondre à "chateau=010-06-LhermDAuroux".

La directive RewriteRule pose une règle, transformer le premier chemin (qui est à nouveau une regex) en seconde chaîne de caractère. La première chaîne est (.*), on pourrait se passer des paranthèses (elles servent à indiquer un groupe), le point . désigne tout caractère et le quantifieur *, signifie que ce qui précède peut être absent, ou présent une ou plusieurs fois. Donc .* veut dire n'importe quelle suite caractère ou même aucun caractère, en bref ; n'importe quelle chaîne. Cette RewriteRule s'appliquera donc à n'importe quel chemin, pourvu que la RewriteCond qui précède soit satisfaite. On aurait pu être plus restrictif en mettant ^_chateaux.php$ à la place de (.*).

La seconde chaîne donne juste la nouvelle URL, sans difficulté ici.

Les drapeaux disent de faire une redirection 301 (R=301), et L qu'il n'est pas nécessaire d'aller plus loin dans l'examen des directives. À défaut de spécifier que c'est une 301, Apache fera une redirection 302 (redirection temporaire), d'où l'intéret de le préciser ici. Le L est optionnel dans ton cas, mais il a son sens par rapport à ce qui est demandé.
 
Nouveau WRInaute
Y'a deux choses à connaître : d'une part les expressions rationnelles, ou expression régulières par transposition de l'anglais regular expression, mais bon dans la pratique ou dit regex. Tu trouveras de la doc dans trop de difficultés. Je suis toujours émerveillé pas les regex, même si quelque part, elles sont perçues comme une horreur par les dev, pas forcément à tort, mais quand même c'est beau. Tu trouveras pléthore de doc sur les regex ; https://regex101.com/, est à mon avis le meilleur outil pour tester, comprendre, s'entraîner, et même analyser une regex.

Et d'autre part la documentation d'Apache, en l’occurrence la page de doc du mod_rewrite et celle des redirections avec mod_rewrite, la liste des expressions et variables, et éventuellement la liste des drapeaux.

Ce que je propose est finalement assez simple.

La première ligne est une directive RewriteCond, si elle est satisfaite (et seulement si), la RewriteRule qui suit sera exécutée. Elle compare la variable QUERY_STRING, c'est-à-dire la chaîne de caractères des paramètres, à l'expression rationnelle ^chateau=010-06-LhermDAuroux$. Le ^ au début de la chaîne indique que la chaîne doit commencer par ce qui suit, et le $ à la fin, qu'elle doit se finir par ce qui précède ; avec les deux, c'est la chaîne de paramètres en entier qui doit correspondre à "chateau=010-06-LhermDAuroux".

La directive RewriteRule pose une règle, transformer le premier chemin (qui est à nouveau une regex) en seconde chaîne de caractère. La première chaîne est (.*), on pourrait se passer des paranthèses (elles servent à indiquer un groupe), le point . désigne tout caractère et le quantifieur *, signifie que ce qui précède peut être absent, ou présent une ou plusieurs fois. Donc .* veut dire n'importe quelle suite caractère ou même aucun caractère, en bref ; n'importe quelle chaîne. Cette RewriteRule s'appliquera donc à n'importe quel chemin, pourvu que la RewriteCond qui précède soit satisfaite. On aurait pu être plus restrictif en mettant ^_chateaux.php$ à la place de (.*).

La seconde chaîne donne juste la nouvelle URL, sans difficulté ici.

Les drapeaux disent de faire une redirection 301 (R=301), et L qu'il n'est pas nécessaire d'aller plus loin dans l'examen des directives. À défaut de spécifier que c'est une 301, Apache fera une redirection 302 (redirection temporaire), d'où l'intéret de le préciser ici. Le L est optionnel dans ton cas, mais il a son sens par rapport à ce qui est demandé.
Merci beaucoup pour toutes ces précisions. Il ne me reste plus qu'à apprendre ;)
Bonne soirée.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut