Version complète: sur le forum Webmaster Hub : Ajout de variable avec l'url rewriting
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Fichier .htaccess et réécriture d'URLs
invader-u
Bonjour,

Ma regle se trouve dans un .htaccess dans le repertoire MONREP
J'ai 2 questions :

1) Je voudrais rediriger de maniere transprente une requete vers une requete avec une variable en plus.

J'ai ecrit cette regle, mais qui semble jamais etre suivie, car $var2 est toujours vide quand je le recupere dans le script index.php

CODE
RewriteRule ^index.php?var1=([0-9]+) index.php?var1=$1&var2=original [L,QSA]


Ma requete est du genre :
CODE
http://www.MONDOMAIN.com/MONREP/index.php?var1=456


2)
Parfois la requete n'est pas comme ci dessous, mais comme ca :
CODE
http://www.MONDOMAIN.com/MONREP/?var1=456


et je voudrais rediriger vers
CODE
index.php?var1=$1&var2=original


Quelle est la regle a mettre ?

Je vous remercie par avance pour l'aide que vous m'aporterez.
Dan
Tu ne peux pas mettre la QUERY_STRING dans la règle, parce que dans ce cas elle n'est pas reconnue.

Il faut mettre une condition, se basant sur la %{QUERY_STRING}, mais pour éviter de boucler à l'infini, il faut aussi s'assurer que cette %{QUERY_STRING} ne contient pas "var2" et dans ce cas ne rien faire.

Donc par exemple:
CODE
RewriteCond %{QUERY_STRING} !var2
RewriteCond %{QUERY_STRING} var1
RewriteRule index\.php index.php?var2=original [QSA,L]


Cela dit que si la %{QUERY_STRING} ne contient pas var2 ET qu'elle contient var1, on rajoute une variable "var2=original" ainsi que les variables qui étaient transmises, grâce au flag [QSA]

Note: Lors de l'utilisation de 2 ou plusieurs RewriteCond, celles-ci sont liées par un "ET Logique". Si on veut inverser cela et avoir un "OU Logique" il faut mettre [OR] en fin de RewriteCond wink.gif


Dan
invader-u
Tout d'abord je te remercie, car comme a ton habitude, c'est tres bien repondu.

Mais cela m'amene a te poser une autre question.
Mon probleme est le suivant :

Je veux rediriger uniquement
index.php?vara=([0-9]+)
index.php?vara=([0-9]+)&varb=([0-9]+)

Mais pas :
index.php?vara=([0-9]+)&var_ni_an_ib_1=([0-9]+)&var_ni_an_ib_2=([0-9]+) ...

idem avec vara et varb
index.php?vara=([0-9]+)&varb=([0-9]+)&var_ni_an_ib_1=([0-9]+)&var_ni_an_ib_2=([0-9]+) ...

en gros je veux rediriger si et seulement si ca contient uniquement vara ou (vara et varb)

Merci par avance


CITATION(Dan @ dimanche 26 mars 2006, 12h34)
Tu ne peux pas mettre la QUERY_STRING dans la règle, parce que dans ce cas elle n'est pas reconnue.

Il faut mettre une condition, se basant sur la %{QUERY_STRING}, mais pour éviter de boucler à l'infini, il faut aussi s'assurer que cette %{QUERY_STRING} ne contient pas "var2" et dans ce cas ne rien faire.

Donc par exemple:
CODE
RewriteCond %{QUERY_STRING} !var2
RewriteCond %{QUERY_STRING} var1
RewriteRule index\.php index.php?var2=original [QSA,L]


Cela dit que si la %{QUERY_STRING} ne contient pas var2 ET qu'elle contient var1, on rajoute une variable "var2=original" ainsi que les variables qui étaient transmises, grâce au flag [QSA]

Note: Lors de l'utilisation de 2 ou plusieurs RewriteCond, celles-ci sont liées par un "ET Logique". Si on veut inverser cela et avoir un "OU Logique" il faut mettre [OR] en fin de RewriteCond wink.gif
Dan
*
invader-u
Je vais essayer de prendre un exemple plus clair :

Je veux rediriger ces 2 regles en y ajoutant une variable.
CODE
http://www.webmaster-hub.com/index.php?showtopic=22954
http://www.webmaster-hub.com/index.php?showtopic=22954&st=90


Comme cela
CODE
http://www.webmaster-hub.com/index.php?showtopic=22954&varajoutee=val
http://www.webmaster-hub.com/index.php?showtopic=22954&st=90&varajoutee=val


Mais par contre je veux pas que ca ajoute cette nouvelle variable si elle est deja ajoutee ou si l'url contient d'autres variables.

Dans mon exemple, je veux pas que ca ajoute si l'url est de ce type :
CODE
http://www.webmaster-hub.com/index.php?showtopic=22954&view=getlastpost
http://www.webmaster-hub.com/index.php?showtopic=22954&pid=457390&st=300&#entry457390  (normalement identique a la suivantecar l'ancre n'est pas transmise)
http://www.webmaster-hub.com/index.php?showtopic=22954&pid=457390&st=300&
http://www.webmaster-hub.com/index.php?showtopic=22954&view=getnewpost
http://www.webmaster-hub.com/index.php?showtopic=22954&hl=blouclage

http://www.webmaster-hub.com/index.php?showtopic=22954&varajoutee=val
http://www.webmaster-hub.com/index.php?showtopic=22954&st=90&varajoutee=val


Je peux faire comme tu dis mais je me demande si il y a pas plus simple et en plus si j'oublie une variable a exclure ca sera pas top :

CODE
RewriteCond %{QUERY_STRING} !view
RewriteCond %{QUERY_STRING} !pid
RewriteCond %{QUERY_STRING} !hl
RewriteCond %{QUERY_STRING} !varajoutee
RewriteCond %{QUERY_STRING} showtopic
RewriteRule index\.php index.php?varajoutee=val[QSA,L]



Merci par avance pour vos conseils


EDITION 1

En plus ca ne semble pas fonctionne.
J'ai mis ca comme regle dans le .htaccess de mon repertoire forum :
CODE
RewriteCond %{QUERY_STRING} !gopid
RewriteCond %{QUERY_STRING} !showforum
RewriteCond %{QUERY_STRING} !view
RewriteCond %{QUERY_STRING} !pid
RewriteCond %{QUERY_STRING} !hl
RewriteCond %{QUERY_STRING} !varajoutee
RewriteCond %{QUERY_STRING} showtopic
RewriteRule index\.php index.php?rfurl=original[QSA,L]


et dans le fichier inddex.php, j'ecris des traces dans un fichier :
ce qui me donne :
CODE
showtopic --> 4110
hl --> texterecherche
request_method --> get
URL entree : /forum/index.php?showtopic=4110&hl=texterecherche
aussi
_low_act -->
act --> st
furlindex -->
t --> 4110
f --> 3


alors que sur une de mes autres regles simple de redirection, j'ai comme trace :
CODE
showforum --> 19
rfurl --> new
URL entree : /forum/messages-conserver,f19.htm
aussi
request_method --> get
_low_act -->
act --> sf
furlindex --> 1
f --> 19


EDITION n2 :
CODE
RewriteRule ^([-a-z0-9\.]*),t([0-9]*).htm index.php?showtopic=$2&titlefriendly=$1&rfurl=new [L,QSA]


Cette regle qui est placee au debut du .htaccess redirige vers la page d'acceuil du forum si j'ai aussi cette regle (en fin de fichier)

CODE
RewriteCond %{QUERY_STRING} !gopid
RewriteCond %{QUERY_STRING} !showforum
RewriteCond %{QUERY_STRING} !view
RewriteCond %{QUERY_STRING} !pid
RewriteCond %{QUERY_STRING} !hl
RewriteCond %{QUERY_STRING} !varajoutee
RewriteCond %{QUERY_STRING} showtopic
RewriteRule index\.php index.php?rfurl=original[QSA,L]


Si je commente la grosse regle ci dessus, la regle precedente fonctionne bien
invader-u
Salut,

1) j'ai interdit la presence de la variable que j'ajoute pour eviter le bouclage (j'avais fait une erreur

2) J'ai reorganise le tout pour optimizer l'execution (sortir plus vite)

3) je me suis apercu que ca s'appliquait aussi aux sous-repertoires, donc j'ai ajoute 2 ligne qui excluent le sous repertoire lofiversion (mais seule la ligne 2 est utile !)

4) J'ai ajoter l'argument R pour que la redirection soit visible

RewriteCond %{PATH_INFO} !lofiversion
RewriteCond %{REQUEST_URI} !lofiversion

RewriteCond %{QUERY_STRING} showtopic
RewriteCond %{QUERY_STRING} !rfurl
RewriteCond %{QUERY_STRING} !view
RewriteCond %{QUERY_STRING} !gopid
RewriteCond %{QUERY_STRING} !showforum
RewriteCond %{QUERY_STRING} !pid
RewriteCond %{QUERY_STRING} !hl
RewriteRule index\.php index.php?rfurl=original[QSA,L,R]

Le probleme, c'est que cette regles est bien lu, il passe toutes les clauses "RewriteCond"
Mais c'est au moment d'executer la "RewriteRule", qu'il estime que c'est la meme URL et donc il ignore la regle !
Et donc je suis redirige vers le fichier index.php du forum sans passage de variable (page d'acceuil du forum)

Ci dessous les traces completes du rewriting dans le fichier de log.

CITATION
559575:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (3) [per-dir /home/my-domain/public_html/forum/] applying pattern 'index\.php' to uri 'index.php'
559576:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='' pattern='!lofiversion' => matched
559577:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='/forum/index.php' pattern='!lofiversion' => matched
559578:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='showtopic' => matched
559579:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!rfurl' => matched
559580:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!view' => matched
559581:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!gopid' => matched
559582:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!showforum' => matched
559583:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!pid' => matched
559584:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (4) RewriteCond: input='showtopic=61095' pattern='!hl' => matched
559585:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (2) [per-dir /home/my-domain/public_html/forum/] rewrite index.php -> index.php?rfurl=original[QSA,L,R]
559586:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (3) split uri=index.php?rfurl=original[QSA,L,R] -> uri=index.php, args=rfurl=original[QSA,L,R]
559587:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (3) [per-dir /home/my-domain/public_html/forum/] add per-dir prefix: index.php -> /home/my-domain/public_html/forum/index.php
559588:MY-IP - - [27/Mar/2006:02:31:43 --0600] [www.my-domain.com/sid#a067028][rid#a296fc8/initial] (1) [per-dir /home/my-domain/public_html/forum/] initial URL equal rewritten URL: /home/my-domain/public_html/forum/index.php [IGNORING REWRITE]



Une idee ?
invader-u
Daaaaaaaaaaaaaaaaaaaaaan au secouuuuuuuuuuuuuuuuurs ;-)

Je cherche, mais rien ne fonctionne et je trouve aucune info nullepart à ce sujet
Dudu
Bonjour
CITATION(invader-u @ lundi 27 mars 2006, 10h58)
3) je me suis apercu que ca s'appliquait aussi aux sous-repertoires, donc j'ai ajoute 2 ligne qui excluent le sous repertoire lofiversion (mais seule la ligne 2 est utile !)

RewriteCond %{PATH_INFO} !lofiversion
RewriteCond %{REQUEST_URI} !lofiversion
Il y a plus simple: annuler depuis ce répertoire les effets du .htaccess placé à un niveau supérieur.

À mettre dans un .htaccess dans le dossier lofiversion
CODE
RewriteEngine off

(ça ne marche pas pour les répertoires virtuels, mais il me semble que ce n'est pas le cas de "lofiversion" sur IPB)

Pour le reste, je ne saurais pas te répondre: ça dépasse largement mes connaissances. Désolé wink.gif
invader-u
CITATION(Dudu @ mardi 28 mars 2006, 04h24)
Bonjour
Il y a plus simple: annuler depuis ce répertoire les effets du .htaccess placé à un niveau supérieur.

À mettre dans un .htaccess dans le dossier lofiversion
CODE
RewriteEngine off

(ça ne marche pas pour les répertoires virtuels, mais il me semble que ce n'est pas le cas de "lofiversion" sur IPB)

Pour le reste, je ne saurais pas te répondre: ça dépasse largement mes connaissances. Désolé wink.gif
*


Je te remercie de ton aide.

Je pense avoit trouve la solution a mon probleme, mais il faut que je teste.

La nuit portant conseil, j'ai pense a un truc pendant que je dormais.

Si ca marche, je poste ici.
invader-u
Re ;-)


J'ai modifie ma regle pour qu'elle s'applique au phpinfo.php et pas index.php

Bon il y avait 2 problemes :

1) Comme je suis un idiot, j'avais pas vu qu'il manquait un espace entre "original" et "[QSA,L,R]" .

2) Une fois regle ce probleme, je me suis apercu que QSA entrainait une erreur :
http://www.my-domain.com/forum/phpinfo.php...bbbbbbbbbbbbbbb
J'etais redirige vers :
http://www.my-domain.com/home/my-domain/public_html/forum/phpinfo.php?rfurl=original&showtopic=aaaaaaaaaaa&st=bbbbbbbbbbbbbbbbbb

Donc j'ai ajoute un :
Rewritebase /forum

et depuis ca marche
invader-u
Il me reste un probleme.

Ne vous focalisez pas sur la pseudo complexité de la condition, le probleme porte sur la RewriteRule.

CODE
RewriteBase   /forum
RewriteCond %{QUERY_STRING} ^showtopic=([0-9]+)(&st=)?([0-9]*)(&)?(hl=)?$
RewriteRule index\.php index.php?rfurl=original [QSA,L]


Mon probleme est simple :
Parfois le nom du fichier index.php est omis et donc la regle ne s'applique pas alors que je voudrais qu'elle s'applique.


Sur cette URL, la regle s'applique
CODE
http://www.my-domain.com/forum/index.php?showtopic=68578


Sur celle ci, elle ne s'applique pas
CODE
http://www.my-domain.com/forum/?showtopic=68578





Pour info, j'ai optimise ma regle :
anciene regle :
CODE
RewriteBase   /forum
RewriteCond %{QUERY_STRING} showtopic=
RewriteCond %{QUERY_STRING} !rfurl=
RewriteCond %{QUERY_STRING} !view=
RewriteCond %{QUERY_STRING} !gopid=
RewriteCond %{QUERY_STRING} !pid=
RewriteCond %{QUERY_STRING} !hl=
RewriteCond %{QUERY_STRING} !mode=
RewriteCond %{QUERY_STRING} !s=
RewriteRule index\.php index.php?rfurl=original [QSA,L]


Avec l'ancienne regle, si j'oubliais un argument c'etait le caca, avec la nouvelle c'est une verification tres stricte
invader-u
Bon je me reponds a moi meme, c'etait simple :

RewriteBase /forum
RewriteCond %{QUERY_STRING} ^showtopic=([0-9]+)(&st=)?([0-9]*)(&)?(hl=)?$
RewriteRule ^(index\.php)?$ index.php?rfurl=original [QSA,L]
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.