Rewrite url manuel

Nouveau WRInaute
Bonsoir,

Je n'ai pas l'habitude de manipuler le fichier htaccess en temps normal, c'est pourquoi je bloque sur quelque chose qui me parait pourtant relativement simple :

Je travail sur Joomla qui me permet de renommer mes URL proprement pour l'ensemble de mon site ... ou presque ! En effet j'ai installé un plugin de catalogue produit relativement simple d'usage (c'était mon souhait), celui-ci me permet simplement de créer des catégories de produits puis des produits, ce qui me donne comme url :
http://www.monsite.fr/reparations/iphone/iphone-11?single_prod_id=176
"/reparations/iphone" correspond à mon arborescence du menu "/iphone-11" correspond à ma catégorie et "?single_prod_id=176" à mon produit.

J'aimerais faire un rewrite sur cet URL pour qu'il ressemble dans le cas présent à :
http://www.monsite.fr/reparations/iphone/iphone-11/ecouteur-interne

Je suis prêt à faire chaque URL une à une, si il le faut ce n'est pas grave même si j'ai conscience qu'il y en aura des centaines.
Je n'y connais rien sur ça alors j'ai pris des exemples simple que j'ai tenté d'adapter :
RewriteCond ^/reparations/iphone/iphone-11?single_prod_id=176$
RewriteRule ^(.*)$ /reparations/iphone/iphone-11/ecouteur-interne [QSD,L]

Résultat mon site ne s'affiche même plus avec ces conditions.

D'avance merci à ceux qui se donnerons du mal pour m'aider.
 
Dernière édition:
WRInaute impliqué
C'est dense à lire, mais c'est toujours utile : https://httpd.apache.org/docs/2.4/fr/mod/mod_rewrite.html

En fait, tu confonds RewriteCond et RewriteRule, là ta RewriteCond ne compare rien, tu fournis juste une chaîne de test sans expression de comparaison.

Une RewriteRule toute seule suffirait à faire ce que tu veux, dans la syntaxe RewriteRule, si le modèle correspond au chemin envoyé dans l'URL, alors la substitution est appliquée.

Je ne suis pas certain de bien saisir ton souhait de réécriture. Quelle est l'URL qui doit s'afficher et quelle est celle que le serveur doit comprendre ?

Enfin, je pense qu'une RewriteMap est plus adaptée qu'une centaine de RewriteRule.
 
Nouveau WRInaute
Je suis en effet complètement perdu ...
D'accord c'est bien ce qu'il me semblait sur le RewriteCond qui me semblait sans effet.

Je souhaite donc que le serveur comprenne l'URL actuellement visible par les visiteurs : http://www.monsite.fr/reparations/iphone/iphone-11?single_prod_id=176

Mais faire un Rewrite pour que les visiteurs et Google puissent voir a la place : http://www.monsite.fr/reparations/iphone/iphone-11/ecouteur-interne

En gros je veux simplement récupérer l'ID de mon paramètres "single_prod_id" pour afficher a la place le nom réel du produit.
 
WRInaute impliqué
C'est ce que j'avais cru comprendre, et en fait tu prends le problème à l'envers.

Il faut partir de l'URL vue côté utilisateur (et moteurs de recherche) et la transformer en ce que doit comprendre le site.

Code:
RewriteRule ^reparations/iphone/iphone-11/ecouteur-interne$ /reparations/iphone/iphone-11?single_prod_id=176 [QSD,L]

Après, une fois encore, une RewriteMap me paraît bien plus adaptée.

Juste pour préciser : on se fout un peu de ce que voient actuellement les utilisateurs (du point de vue de la problématique ModRewrite). Le problème, sur un site déjà mis en publication, c'est que ces URL anciennes ont pu être indexées, et qu'il faut donc faire gaffe à ça, URL Canonique, voir redirection 301, etc. C'est pour ça que c'est pas mal d'anticiper ces questions d'URL dès le début.
 
Nouveau WRInaute
En effet ça fonctionne bien, je peux désormais accéder à mon produit via la nouvelle URL :
reparations/iphone/iphone-11/ecouteur-interne

Merci beaucoup !

Il s'agit d'une nouvelle version de mon site, donc pas de soucis d'URL déjà indexée (a part celle de l'ancien site qui seront gérées le moment venus)

J'ai un dernier petit souci, en effet mes produits sont générés automatiquement via le catalogue donc les boutons "voir ce produit" ont pour lien l'URL avec paramètres. Puis-je effectué une redirection 301 de mon URL "paramètres" vers l'URL "propre" ?

J'ai tenté sans succès :
Redirect 301 /reparations/iphone/iphone-11?single_prod_id=176 /reparations/iphone/iphone-11/ecouteur-interne

C'est désormais mon URL propre qui est redirigées vers l'ancienne. Idem en inversant :confused:


J'ai jeté un oeil au RewriteMap, en effet ça a l'air bien plus intéressant. En créant un fichier .txt avec les correspondance ID=nom du produit je serais en mesure de rediriger automatiquement. Et il me suffira de remplir mon .txt au fur et à mesure des nouveaux produits... super ça. :)
 
WRInaute impliqué
Alors, pour répondre à ta question, d'après la documentation Apache :
Lorsque des directives Redirect et RewriteRule se trouvent dans la même portée, les directives RewriteRule sont exécutées en premier, sans tenir compte de leur ordre d'apparition dans le fichier de configuration.

Donc, faire la redirection sous forme d'une RewriteRule, mais avec des paramètres ça devient lourd. Il y a peut être moyen de faire ça plus intelligemment que ce que je te propose :
Code:
RewriteCond %{REQUEST_URI}  ^/reparations/iphone/iphone-11$
RewriteCond %{QUERY_STRING} ^single_prod_id=176$
RewriteRule ^.*$ /reparations/iphone/iphone-11/ecouteur-interne [R=301,L]
Naturellement, à insérer dans le .htaccess avant l'autre RewriteRule.

Mais tu comprends que ça va devenir un bazar sans nom dans ton .htaccess, et avec des redirections en grand nombre sur ton serveur, ce qui n'est jamais optimal. Mieux vaut régler le problème à l'origine et corriger la manière dont les liens sont générés. Avoir des liens sur son propre site qui pointent vers une page en 301 est une mauvaise chose.

Si tu ne peux pas régler le problème à la base (que les URL internes soient les bonnes), je m'interrogerais sur la pertinence d'un URL Rewriting. Le texte dans l'URL a un intérêt secondaire en référencement (par rapport au contenu, au maillage interne et externe). Là tu vas consacrer beaucoup d'efforts dans un truc qui sert pas à grand chose avec un risque d'effets négatifs non négligeable (Duplicate content, charge serveur, erreurs sur certains liens, signaux contradictoires envoyés aux moteurs de recherche, etc.).
 
Nouveau WRInaute
Bon j'ai suivi ton conseil et j'ai regardé de plus prêt dans la "construction" des liens à l'origine de chaque produit pour y implémenter le nom de mon produit directement.

Je me retrouve désormais avec un lien de ce format :
/reparations/iphone/iphone-11/ecouteur-interne
A la place de l'ancienne url
/reparations/iphone/iphone-11?single_prod_id=176

Je peux donc désormais ajouter une à une mes URL dans mon htaccess pour les rediriger tel que tu me l'a montré et ça fonctionne.
Le problème c'est qu'à l'ajout d'un nouveau produit je serais contraint d'aller ajouter sa redirection dans le htaccess ... c'est problématique.


Je vais devoir me pencher sur le RewriteMap pour simplifier tout ça ...
 
Nouveau WRInaute
Je suis donc parvenu à obtenir le résultat souhaité mais je me retrouve en effet avec 154 lignes supplémentaires dans mon htaccess :p

J'ai regardé un peu le RewriteMap mais un élément me bloque. En effet le RewriteMap me permet de faire correspondre la valeur de mon paramètre à la valeur présente dans mon URL, comme ceci si j'ai bien compris :

Code:
RewriteMap map-products "txt:/chemin-map/map.txt"
RewriteRule "^/iphone-11/(.*)" "${map-products:$1}"

Avec une map comme celle-ci :
Code:
ecouteur-interne 176
batterie 177
camera-facetime 178
caméra-arriere 179
etc...

Le problème c'est que j'ai pas mal de catégories produits différentes : iPhone 5, 5S, 5C, SE, 6, 6S etc... bref ça m'oblige à créer autant de Map que de catégories, soit 54 ... c'est déjà moins mais pas encore satisfaisant pour "automatiser" la chose au maximum.

Est-ce possible de récupérer la valeur débutant mon url, c'est à dire "/iphone-11/" dans notre exemple afin de l'utiliser dans mon RewriteMap et ainsi faire une double condition du type :

Code:
iphone-11 ecouteur-interne 176
iphone-11 batterie 177
iphone-11 camera-facetime 178
iphone-11 caméra-arriere 179

iphone-11-pro ecouteur-interne 180
iphone-11-pro batterie 181
etc...


Edit :
J'ai l'impression que je vais devoir intégrer mon ID produit dans mon URL "propre" afin de ne créer qu'une seule map.
URl du type /iphone-11/176-ecouteur-interne

J'ai raison ? :(
 
Dernière édition:
WRInaute impliqué
Je connais bien moins la pratique des RewriteMap, mais j'ai peut-être quelques éléments de réponse :

Toujours d'après la doc (https://httpd.apache.org/docs/2.4/fr/rewrite/rewritemap.html), la table de correspondance (la directive RewriteMap) ne peut pas être déclarée dans un .htaccess, mais uniquement au niveau du serveur principal. Donc suivant tes options d'hébergement ça peut être dirimant.

Une rewrite map fait correspondre une clé à une valeur. Les clés comme les valeurs peuvent être arbitraires, il n'est pas nécessaire qu'un élément se retrouve. Dans la map :
Code:
iphone/iphone-11/ecouteur-interne iphone/iphone-11?single_prod_id=176

et dans le .htaccess (ou ailleurs) :
Code:
RewriteRule ^reparations/(.*) /reparations/${map-products:$1}
 
Nouveau WRInaute
En effet vu comme ça je pourrais m'en sortir avec une seule map. Je vais me renseigner sur la déclaration côté serveur.

Merci pour ton aide.
 
Discussions similaires
Haut