URL Rewriting recursif en ajoutant du texte dans l'URL à la

  • Auteur de la discussion Auteur de la discussion KERIN
  • Date de début Date de début
Nouveau WRInaute
Bonjour à tous

J'ai lu les articles de Dan chez WebmasterHub et j'ai trouvé très intéressant d'utiliser la récursivité. Je me suis donc lancé mais en ajoutant une difficulté "FATALLE": Je souhaite pouvoir ajouter du texte à la suite des variables.

par exemple:
/var1-val1-var2-val2/mon-texte-pour-compliquer.html
qui serait donc réécrit:
index.php?var1=val1&var2=val2

Mon délimiteur variables - texte serait le caractère "/"

Le processus normal serait:
1) supprimer tout ce qui est après le dernier "/" dans l'URL et rediriger sur tout ce qu'il y avait avant
2) utiliser la récurssion de Dan pour récupérer mes variables.

Séquanciellement ca devrait nous donner:
/var1-val1-var2-val2/mon-texte-pour-compliquer.html
/var1-val1-var2-val2.html
/var1-val1&var2=val2.html
/index.php?var1=val1&var2=val2


FACILLEEEE que je vous entend déja faire... ben j'y suis depuis 2heures et j'ai un comportement plustot étrange de la part d'apache.
Voici mon .htaccess:

Code:
RewriteEngine on
RewriteRule (.+)/([^/]+)\.html $1\.html
RewriteRule (.+)-([^-]+)-([^-&]*)([^-]*)\.html $1&$2=$3$4\.html [N]
RewriteRule ([^-]+)-([^-]*)(.*)\.html index2.php?$1=$2$3 [L]

et voila le log sorti du ModRewrite:
Code:
  rewrite lang-fr-category_id-21-action-view/les-clubs.html -> lang-fr-category_id-21-action-view.html
  rewrite lang-fr-category_id-21-action-view.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html
  rewrite lang-fr-category_id-21-action-view.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html
  rewrite lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html/les-clubs.html -> lang-fr-category_id-21-action-view.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html.html

Vous l'avez compris, lors de la réécriture, Apache a une sérieuse tendance à me rajouter "/les=clubs.html" et à rentrer dans une boucle infinie...

J'ai essayé plusieurs choses:
d'une l'instruction:
Code:
RewriteRule (.+)/([^/]+)\.html $1\.html
SEULE, me redirige bien
/lang-fr-category_id-21-action-view/les-clubs.html
vers
/lang-fr-category_id-21-action-view.html

Donc apres je comprend pas trop pourquoi il me rajoute toujours des merdes à la fin... j'ai essayé des milliers de trucs et... sans succès, si quelqu'un peut m'aider :)

Merciiiiiii[/i]
 
WRInaute occasionnel
KERIN a dit:
je comprend pas trop pourquoi il me rajoute toujours des merdes à la fin... j'ai essayé des milliers de trucs et... sans succès, si quelqu'un peut m'aider :)
Ca vient du fait que tu n'as pas mis de ^ et de $ dans ton expression régulière. Ce qui fait qu'Apache s'emmêle un peu les pinceaux quand il rencontre la règle :
Code:
RewriteRule (.+)/([^/]+)\.html $1\.html
Du coup quand tu tapes l'url :
Code:
lang-fr-category_id-21-action-view/les-clubs.html
Alors Apache va obéir à ta règle et transformer cette requête en :
Code:
lang-fr-category_id-21-action-view.html
Mais ensuite il va substituer la chaîne :
Code:
lang-fr-category_id-21-action-view/les-clubs.html
par ...
Code:
lang-fr-category_id-21-action-view.html/les-clubs.html

Et la boucle est infinie.

Essaie plutôt comme regexp la suivante :
Code:
RewriteRule ^([^/]+)/[^/]+\.html$ $1\.html

correiaj a dit:
Tu verras que tu peux tout faire en une seule règle:
RewriteRule var1-([a-z0-9]+)-var2-([a-z0-9]+)/.* http://tonsite/index.php?var1=$1&var2=$2 [L-NC]
Tout-à-fait d'accord avec toi Correiaj sur le principe ;) ... mais je pense qu'il voulait plutôt faire qqch comme ça :
Code:
RewriteRule ^([^-]+)-([^-]+)-([^-]+)-([^-]+)-([^-]+)-([^-]+)-([^-]+)-([^-]+)/.*$ /index.php?$1=$2&$3=$4&$5=$6&$7=$8 [L]
(à adapter selon le nombre max. de variables)
 
Nouveau WRInaute
SuperPJ a dit:
Ca vient du fait que tu n'as pas mis de ^ et de $ dans ton expression régulière. Ce qui fait qu'Apache s'emmêle un peu les pinceaux

OK cool merci je vais tester ca demain au boulot

correiaj a dit:
Tu verras que tu peux tout faire en une seule règle:
RewriteRule var1-([a-z0-9]+)-var2-([a-z0-9]+)/.* http://tonsite/index.php?var1=$1&var2=$2 [L-NC]
Mon but est d'avoir une quantité indéfinie de variables alors... je pense pas que ca passe. Merci quand meme j'y avait pensé

Merci encore, j'espere que ca va marcher :)

Tchooo
 
WRInaute passionné
Re: URL Rewriting recursif en ajoutant du texte dans l'URL à

Et pourquoi pas ...
Code:
RewriteEngine on
RewriteRule (.+)/([^/]+)\.html $1\.html
RewriteRule ([^/]+)-([^-/]+)-([^-/&]*)([^/-]*)\.html $1&$2=$3$4\.html [N]
RewriteRule ([^/-]+)-([^/-]*)([^/]*)\.html index2.php?$1=$2$3 [L]

Certains te diront que si ton nombre de paramètres dans un site web est indéterminé... soit tu fais du spamdexing soit c'est le site qui est mal conçu. :?
 
WRInaute occasionnel
Correiaj je n'ai pas trop compris ton expression régulière :?

Si j'ai bien compris Kerin, il voulait à partir de ...
h*tp://www.monsite.com/var1-val1-var2-val2/mon-texte-pour-compliquer.html
... obtenir :
h*tp://www.monsite.com/index.php?var1=val1&var2=val2

or ton expression régulière :
Code:
RewriteRule (/.*)([^-]+)-([^/]+)/.*html http://tonsite$1/index.php?$1=$2
... remplacera (sauf erreur) :
h*tp://www.monsite.com/var1-val1-var2-val2/mon-texte-pour-compliquer.html
par :
h*tp://www.monsite.com/var1-val1-var/index.php?/var1-val1-var=2

(le "(/.*)([^-]+)-([^/]+)/" coupe "/var1-val1-var2-val2/" en $1="/var1-val1-var" et $2="2")

En plus il me semble que tu as oublié d'echapper le ? de "index.php?(.*)" dans ta 2nde expression régulière :
Code:
RewriteRule (/.*)-([^-]+)-([^/]+)/index.php?(.*) http://tonsite$1/index.php?$4&$2=$3
 
WRInaute impliqué
non la première règle remplace:
....varn-valn/nimportequoi.html en http://tonsite/.../index.php?var1=val1
et la seconde règle transforme
/var1-val1.../index.php?var1=val1 en http://tonsite/.../index.php?var1=val1&varn-1=valn-1

et cela jusqu´à que n-x=1
edit:
Pour corriger mes règles:

RerwriteRule (/.*)([^-]+)-([^/]+)/.*html http://tonsite$1/index.php?$1=$2
RewrireRule /([^-]+)-([^-/]+)([^/]*)/index.php?(.*) http://tonsite$3/index.php?$4&$1=$2

et le ? est retiré puis rajouté dans la seconde règle...
 
WRInaute occasionnel
Tu as testé cette règle ? ;) je ne suis pas sûr qu'elle fasse ce que tu dis ;)

De plus il y a une erreur dans ton expression régulière :
Code:
RewrireRule /([^-]+)-([^-/]+)([^/]*)/index.php?(.*) http://tonsite$3/index.php?$4&$1=$2
tu as oublié d'échapper le ? et le . : tu dois remplacer "index. php?(.*)" par "index\. php\?(.*)"
... sinon comme tu le sais il va considérer ? comme le quantifieur "0/1" et . comme "any character".
 
Nouveau WRInaute
SuperPJ a dit:
De plus il y a une erreur dans ton expression régulière :
Code:
RewrireRule /([^-]+)-([^-/]+)([^/]*)/index.php?(.*) http://tonsite$3/index.php?$4&$1=$2
tu as oublié d'échapper le ? et le . : tu dois remplacer "index. php?(.*)" par "index\. php\?(.*)"
... sinon comme tu le sais il va considérer ? comme le quantifieur "0/1" et . comme "any character".

Oui en effet il y a une erreur, j'ai oublié les backslash sur les . et ? mais de toute facon ma boucle se créait avant d'arriver à cette regle...

Je teste ca au boulo tout a l'heure et je vous dit ce qu'il en est :)

MERCI bcp pour votre aide et vos remarques à tous!! :lol: :lol: :D :D :lol: :lol:
 
WRInaute passionné
correiaj
ça fait deux mois que je te répète que tu peux pas réécrire index.php?truc=muche parce que tu ne peux pas accéder au query string dans ton .htaccess...

je parle dans le vide ? :lol:
 
Nouveau WRInaute
Je deviens fou...

voici les 3 regles que j'ai donc corigé d'après vos conseils:
Code:
RewriteRule ^([^/]+)/[^/]+\.html$ $1\.html
RewriteRule ^(.+)-([^-]+)-([^-&/]*)([^-/]*)\.html$ $1&$2=$3$4\.html [N]
RewriteRule ^([^-]+)-([^-]*)(.*)\.html$ index2\.php\?$1=$2$3 [L]

J'ai toujours le probleme qu'il m'ajoute des /les=clubs.html à la fin de mon URL, ce qui fait que une URL du type:
/lang-fr-category_id-21-action-view/les-clubs.html
est transformée en
/lang-fr-category_id-21-action-view.html
Puis
/lang-fr-category_id-21action&view/les=clubs.html
Puis
/lang-fr-category_id-21&action&view/les=clubs.html/les=clubs.html
puis encore
/lang-fr-category_id&21&action&view/les=clubs.html/les=clubs.html/les=clubs.html

pour finir en
index2.php?lang&fr&category_id&21&action&view/les=clubs.html/les=clubs.html/les=clubs.html/les=clubs.html/les=clubs.html.html

Ca me saoul un peu... je comprend vraiment pas ce bug qu'il m'ajoute des /les=clubs.html à chaque fois à la fin malgré les ^ et $ pour délimiter la chaine...


EDIT:
J'avais pas vu ta réponse Dj_Apx, "l'accès au query sting"? WTF is it? je vais peut être passer pour un con mais je comprend pas trop... :p
 
WRInaute impliqué
Oui désolé, (et même trois).
Moi la meilleure solution que j´ai trouvé, c´est ça:

dans le .htaccess:
RewriteRule ([^/]+)/(.*)\.html http://127.0.0.1/url.php?url=$1

et Créer un fichier donc url.php comme ça:

<?
$ch_nb = substr_count ($_GET['url'],'-');

while($ch_nb>0)
{

$url= strpos($_GET['url'],'-');
$_GET['url']=substr_replace ($_GET['url'],'=',$url,1);
if($ch_nb>1)
{
$url= strpos($_GET['url'],'-');
$_GET['url']=substr_replace ($_GET['url'],'&',$url,1);
}
$ch_nb = $ch_nb - 2;
}
$url= $_GET['url'];

die('
<script language="javascript">
<!--
document.location.href="index.php?'.$url.'"
//-->
</script>
');
?>
 
WRInaute impliqué
En fait, voila pour les RW:

RewriteRule (.*)(-)(.*) $1=$3
RewriteRule (.*)(-)(.*) $1&$3 [N]
RewriteRule ([^-/]+)/.* index.php?$1

Et ça marche nickel
 
WRInaute impliqué
Et puis après, c´est clair il faut lier les règles et mettre les condition pour exclure tous les autres types d´url. Mais c´est facile...
 

➡️ 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