Regex htaccess : ajouter un paramètre à un lien

WRInaute discret
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.
 
WRInaute discret
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.
 
WRInaute occasionnel
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...
 
WRInaute accro
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.
 
WRInaute discret
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 ?
 
WRInaute occasionnel
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 ?
 
WRInaute discret
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.
 
WRInaute accro
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.
 
WRInaute occasionnel
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...
 
WRInaute occasionnel
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)...
 
WRInaute discret
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:
 
WRInaute discret
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.
 
WRInaute impliqué
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:
 
WRInaute discret
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.
 
WRInaute impliqué
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';
      }
   }
};
 
WRInaute discret
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 !
 
WRInaute impliqué
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)) {
 
WRInaute discret
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';
      }
   }
 
WRInaute discret
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.
 
Discussions similaires
Haut