Regex htaccess : ajouter un paramètre à un lien

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par MIMATA, 8 Décembre 2010.

Tags:
  1. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Bonjour,

    J'essaie de construire un règle RewriteRule dans mon htacces mais sans succès. :?

    Je cherche à détecter les liens vers un site précis et à y ajouter simplement un paramètre à la fin.

    Plus précisément, je cherche à changer les liens du type :
    Code:
    http://www.lesitededestination.com/UN-OU-PLUSIEURS-REPERTOIRES/p,DES-CHIFFRES
    en la même url mais avec un paramètre à la fin :
    Code:
    http://www.lesitededestination.com/UN-OU-PLUSIEURS-REPERTOIRES/p,DES-CHIFFRES?parametre=monid
    sachant que ce que j'ai écrit en majuscule sont des variables dans les url de destination.

    J'ai péniblement écrit ça en utilisant ce générateur :
    Code:
    RewriteRule ^(http:\/\/www.lesitededestination.com\/)|^.*?|^\d$ ^(http:\/\/www.lesitededestination.com\/)|^.*?|^\d|^(\?parametre=monid)$ [L] 
    mais bien sûr ça ne marche pas, j'ai une erreur 500...

    En plus, je n'ai pas su intégrer le p, d'avant les chiffres...

    Quelqu'un pourrait me corriger ?

    Merci

    PS : J'ai essayé de poster ce message hier mais visiblement ça ne marchait pas, j'ai cliqué plusieurs fois sur Envoyer et aujourd'hui je constate que 4 sujets ont été créés mais ne sont pas accessibles...je m'excuse auprès des utilisateurs du forum et auprès des administrateurs mais je n'ai aucun moyen de les signaler ni de les supprimer. Bien que s’affichant avec mon pseudo, je ne les vois même pas dans la liste des mes sujets dans le panneaux d'utilisateur.
     
  2. KOogar
    KOogar WRInaute accro
    Inscrit:
    16 Novembre 2004
    Messages:
    4 665
    J'aime reçus:
    78
    ca peut pas fonctionner, ecrit les a la main :wink:
     
  3. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Oh ! 8O Sérieux ?! :) On peut pas modifier un lien sortant en htaccess ! Ah ben je pouvais chercher :D
    Justement, je les écris à la main et je voulais changer ça parce que c'est un peu pénible en fait :wink:
    Arf...j'ai perdu mon temps...

    Merci pour ta réponse rapide.
     
  4. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    ya toujours un moyen simple qui me vient a l'esprit...

    tu réécris toutes les adresses du type que tu veux (faut savoir les définir, je suppose que tu sais le faire) vers un fichier rewrite.php?k=http://www.ton-adresse.com/aussi/longue/soit-elle.html

    Et ensuite dans ce fichier rewrite.php tu effectues des opérations sur cette variable.
    Code:
    <? $k="http://www.ton-adresse/aussi/longue/soit-elle.html"; // ta fameuse adresse à réécrire
    if (preg_match('#^(http:\/\/(?:w{3}\.)[^\.]+\.[a-z\.]{2,6}(?:\/.*)?)$#i',$k,$matches)) //tu t'assures que ca ressemble à une adresse.. en rajoutant des contraintes selon ton besoin...
    {
    header("HTTP/1.1 301 Moved Permanently"); // et tu renvoie vers la page que tu veux...
    header ('location: '.$matches[1].'?tonfameuxparametre='.rand(1,100)); // tu mets ce que tu veux a la place de ce rand;
    header("Connection: close"); // bien fermer la connexion lol
    }
    
    tu as aussi beaucoup d'autres méthodes...
     
  5. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 593
    J'aime reçus:
    0
    Eeeuuuhhh... Quand tu dis "Je cherche à détecter les liens vers un site précis", tu veux dire quoi? Tu veux modifier les liens qui apparaissent dans tes pages et qui pointent vers un site externe? Si c'est ça, rien à voir avec RewriteRule: RewriteRule permet de reformater les requêtes reçues par ton serveur, pas les réponses qu'il renvoie...

    (et si c'est les requêtes reçues que tu veux reformater, ta RewriteRule est effectivement très loin du compte, mais on va attendre confirmation de ce que tu veux faire exactement avant d'aller plus loin).

    Jacques.
     
  6. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    En fait j'ai un forum d'astronomie sous phpbb3 et j'ai un partenariat avec un site de vente de matériel d'astronomie.

    Pour que mon id d'identification soit reconnu par le site partenaire, je dois ajouter un paramètre du type ?affiliate_id=monid à la suite des liens qui pointe vers les différentes pages de son site.
    Or, quand les membres placent des liens dans leurs messages vers des pages de ce site, pour par exemple demander des conseils sur l'achat de tel ou tel type d'instrument, ils mettent simplement un lien vers les pages correspondantes mais bien sûr ils n'ajoutent pas le paramètre qui m'identifie auprès du partenaire.
    Actuellement, j'édite donc les messages pour ajouter ce paramètre manuellement mais je cherchais un moyen simple de l'ajouter systématiquement et automatiquement.

    Suis-je plus clair ?
     
  7. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    si tout ce passe en interne dans le site... un petit preg_replace bien ciblé ... le tour est joué ;)
     
  8. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    Alors a mon avis tu peux utiliser preg_replace en faisant des remplacements dans le systeme de cache... ce qui est extrèmement rapide ... As tu un systeme de cache ?
     
  9. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Les liens sortent directement mais ta solution est peut-être bien la bonne, rediriger ces liens vers une url interne et les faire resortir grâce à ton script.

    Par contre, oui il y a un système de cache mais je vois pas bien comment tu vois la chose.
     
  10. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 593
    J'aime reçus:
    0
    Plusieurs solutions au niveau php:
    - tu fais la modif lors de l'ajout du message (insertion en base)
    - tu fais la modif lors du chargement du message
    - tu utilises ob_start/ob_end_flush et un callback qui va modifier le buffer avant de l'envoyer

    Il y en a probablement d'autres. Dans tous les cas un preg_replace devrait permettre de faire la modif.

    Autre option: tu fais la modif en base directement, avec un petit script à lancer périodiquement (idéalement en cron). Ca va laisser un petit décalage entre le moment où le lien est ajouté et celui où il est modifié, mais ça évite de toucher au code existant.

    Dernière option: modif en base via un trigger qui va automatiquement éditer le texte avant de l'insérer.

    Jacques.
     
  11. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    en fait dans le cache tu fais

    Code:
    <?
    $data=file_get_contents('ton-repertoire-cache/ton-fichier-cache.html');
    $data=preg_replace('#"http:\/{2}lesitedetonpartenaire\.com([^"]+)#i','"http://lesitedetonpartenaire.com\1?parametre=identifiant',$data);
    $fp =
     fopen('ton-repertoire-cache/ton-fichier-cache.html', 'w');
    fwrite($data, '1');
    fclose($fp);
    ?>
    et voila tout le cache est remplacé avec ton identifiant...
    
     
  12. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    Si tu me donnes les bonnes infos, je te fais ce truc simplement

    dis moi ou est le systeme de cache a partir de l'index.php du forum, dis moi comment s'apellent les fichiers cache (leur structure)...
     
  13. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Merci beaucoup à vous deux, j'ai plein de solutions alternatives maintenant !

    Alors, je réfléchis...

    Je me dis que modifier directement dans la base n'est peut être pas la meilleure solution car si jamais pour une raison ou pour une autre j'arrête ce partenariat, l'idéal serait que je n'ai pas de trace de cet identifiant dans la base...même si ça ne gène pas vraiment, ce serait plus propre.

    Le truc du "ob_start/ob_end_flush et un callback qui va modifier le buffer avant de l'envoyer"...je sais pas ce que c'est :mrgreen:

    Modifier le cache, pourquoi pas, mais je vais devoir lancer ce script régulièrement, le plus souvent pour rien, et je vais avoir un intervalle de temps entre l'envoi du message et le cron suivant...or il arrive souvent que les réactions dans les sujets soient assez rapide...

    Modifier à l'affichage du message me plait bien, le seul truc c'est que le code à modifier apparait de cette façon :
    Code:
    <div class="content">{postrow.MESSAGE}</div>
    et je ne suis pas sûr de pouvoir traiter {postrow.MESSAGE} en php...

    La solution du fichier rewritte.php n'est pas mal : une ligne dans le htaccess pour rediriger les liens sortant vers ce site vers une page interne et les faire resortir proprement. C'est immédiat, simple et sans traces, ça me plait bien aussi !

    Voilà où j'en suis de ma réflexion :
    1° - Traiter la chaîne {postrow.MESSAGE}, si c'est possible, pour modifier le message à l'affichage
    2° - le fichier rewritte.php avec une commande dans le htaccess pour rediriger les liens

    Qu'en pensez-vous ?

    Et oui, je veux bien un coup de main pour la partie regex :wink:
     
  14. michel.leonard
    michel.leonard WRInaute occasionnel
    Inscrit:
    1 Juin 2010
    Messages:
    366
    J'aime reçus:
    0
    mais tu n'arrives pas a faire tout simplement la modification dans la source que t'a donné ton partenaire ? pour info...
     
  15. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Non ce n'est pas vraiment un code source, c'est juste un id à ajouter à n'importe quel lien pointant vers n'importe qu'elle pas de son site.
     
  16. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    Tu peux pas le faire en javascript ?
     
  17. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Peut-être mais comment devrais-je m'y prendre ?
     
  18. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    un truc dans le genre (vite fait) :

    Code:
    window.onload = function(){
    	var links = document.getElementsByTagName('A');
    	for (var i=0, link; link=links[i]; i++){
    		if (link.href.indexOf('example.com') > -1) {
    			link.href += '?le_param';
    		}
    	}
    };
    - j'ai pas testé
    - si tu utilise une librairie js, il peut être judicieux de l'utiliser :wink:
     
  19. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Ah oui ! Toujours le même problème avec link.href.indexOf('example.com') qui doit intégrer une expression régulière mais cette solution est peut-être encore plus simple que les autres.
     
  20. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    Oublié les conditions, p'têtre ça alors ?

    Code:
    window.onload = function(){
       var links = document.getElementsByTagName('A');
       var reg = new RegExp('^http://www\.lesitededestination\.com/.+/p,[0-9]+$');
       for (var i=0, link; link=links[i]; i++){
          if (link.href.match(reg)) {
             link.href += '?le_param';
          }
       }
    };
     
  21. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Super, ça marche, sauf quand je veux atteindre directement le nom de domaine sans qu'il y ait de sous répertoires dans l'url...

    Ouais je sais, je suis un peu un boulet mais je pige vraiment rien aux regex, et je suis une bille en manipulation du dom en js :mrgreen: Il faut que je me soigne !
     
  22. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    C'est quoi la demande exactement ?


    - tous les liens de ce domaine ?
    première solution que j'ai proposé

    - uniquement ce domaine et p,123 ?
    seconde solution

    - racine ET liens avec p,123 :
    remplacer if (link.href.match(reg)) { par if (link.href=='http://www.lesitededestination.com/' || link.href.match(reg)) {
     
  23. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Tous les liens du domaine mais avec le code que tu m'a indiqué, les liens qui pointent seulement vers le nom de domaine, sans rien après, ne sont pas redirigés.

    Code:
    var reg= new RegExp('^http://www\.lesite\.de/.+/p,[0-9]+$');
       for (var i=0, link; link=links[i]; i++){
          if (link.href == 'http://www.lesite.de' || link.href.match(reg)) {
             link.href += '?affiliate_id=monid';
          }
       }
     
  24. seebz
    seebz WRInaute impliqué
    Inscrit:
    15 Avril 2007
    Messages:
    728
    J'aime reçus:
    0
    Il manque le / final ;)
     
  25. MIMATA
    MIMATA WRInaute discret
    Inscrit:
    6 Avril 2004
    Messages:
    92
    J'aime reçus:
    0
    Champagne pour tout le monde ! :D

    Merci à tous pour vos propositions et votre aide ! Mon problème est résolut et fonctionne à merveille.

    Merci à jcaron pour tes propositions bien que pas à ma portée...
    Merci aussi à michel.leonard pour les différentes pistes que tu m'a proposé, je saurai m'en souvenir et les mettre en oeuvre dans d'autres projets si besoin.
    Et merci à seebz pour cette dernière solution qui s'est avérée être la plus simple à mettre en place et qui fonctionne.
     
Chargement...
Similar Threads - Regex htaccess ajouter Forum Date
RegEx dans .htaccess Débuter en référencement 26 Mars 2019
Regex htaccess Administration d'un site Web 20 Novembre 2016
Besoin d'aide regle regex sur fichier HTACCESS Administration d'un site Web 3 Mars 2013
Regex - htaccess - 301 Netlinking, backlinks, liens et redirections 12 Mai 2012
Changement complet d'url : htaccess redirectMatch regex et variables Débuter en référencement 26 Juillet 2010
[résolu] Souci avec un regex (htaccess) Développement d'un site Web ou d'une appli mobile 27 Mars 2010
[Résolu] Pb de regex dans mon htaccess URL Rewriting et .htaccess 7 Janvier 2010
Regex : un peu d'aide Développement d'un site Web ou d'une appli mobile 19 Novembre 2020
URL rewriting et REGEX bonnes pratiques Développement d'un site Web ou d'une appli mobile 9 Septembre 2020
RegExp du Rewrite URL Rewriting et .htaccess 19 Décembre 2019