Rewrite url manuel

Discussion dans 'URL Rewriting et .htaccess' créé par Tixy22, 19 Avril 2020.

  1. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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.
     
    #1 Tixy22, 19 Avril 2020
    Dernière édition: 19 Avril 2020
  2. emualliug
    emualliug WRInaute discret
    Inscrit:
    1 Février 2020
    Messages:
    238
    J'aime reçus:
    44
    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.
     
  3. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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.
     
  4. emualliug
    emualliug WRInaute discret
    Inscrit:
    1 Février 2020
    Messages:
    238
    J'aime reçus:
    44
    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.
     
  5. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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. :)
     
  6. emualliug
    emualliug WRInaute discret
    Inscrit:
    1 Février 2020
    Messages:
    238
    J'aime reçus:
    44
    Alors, pour répondre à ta question, d'après la documentation Apache :
    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.).
     
  7. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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 ...
     
  8. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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 ? :(
     
    #8 Tixy22, 21 Avril 2020
    Dernière édition: 21 Avril 2020
  9. emualliug
    emualliug WRInaute discret
    Inscrit:
    1 Février 2020
    Messages:
    238
    J'aime reçus:
    44
    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}
     
  10. Tixy22
    Tixy22 Nouveau WRInaute
    Inscrit:
    19 Avril 2020
    Messages:
    7
    J'aime reçus:
    0
    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.
     
Chargement...
Similar Threads - Rewrite manuel Forum Date
RegExp du Rewrite URL Rewriting et .htaccess 19 Décembre 2019
Ne prendre qu'une partie d'un QueryString dans une regex RewriteCond URL Rewriting et .htaccess 9 Décembre 2019
Astuce RewriteMap : convertir un .dbm.pag en txt ? Débuter en référencement 8 Juillet 2019
rewriteRule sur wamp erreur 404 URL Rewriting et .htaccess 20 Avril 2019
URL Rewriting : difficultés avec RewriteCond ? URL Rewriting et .htaccess 5 Décembre 2018
Problème avec ma ligne rewrite URL Rewriting et .htaccess 20 Juin 2018
Déplacer les RewriteRule du .htaccess vers le vhost URL Rewriting et .htaccess 16 Janvier 2018
Rewrite URL comment faire Débuter en référencement 17 Septembre 2017
Rewrite repertoire virtuel -> erreur 404 suite à maj serveur URL Rewriting et .htaccess 24 Juin 2017
aide pour écriture rewritecond URL Rewriting et .htaccess 6 Avril 2017