Aller au contenu

Ajout de variable avec l'url rewriting


Sujets conseillés

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

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

Ma requete est du genre :

http://www.MONDOMAIN.com/MONREP/index.php?var1=456

2)

Parfois la requete n'est pas comme ci dessous, mais comme ca :

http://www.MONDOMAIN.com/MONREP/?var1=456

et je voudrais rediriger vers

index.php?var1=$1&var2=original

Quelle est la regle a mettre ?

Je vous remercie par avance pour l'aide que vous m'aporterez.

Modifié par invader-u
Lien vers le commentaire
Partager sur d’autres sites

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:

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 ;)

Dan

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

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

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:

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 ;)

Dan

<{POST_SNAPBACK}>

Modifié par invader-u
Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Je vais essayer de prendre un exemple plus clair :

Je veux rediriger ces 2 regles en y ajoutant une variable.

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

Comme cela

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 :

http://www.webmaster-hub.com/index.php?showtopic=22954&view=getlastpost
http://www.webmaster-hub.com/index.php?showtopic=22954&pid=457390&st=300entry457390  (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 :

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 :

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 :

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 :

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 :

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)

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

Modifié par invader-u
Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

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.

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 ?

Modifié par invader-u
Lien vers le commentaire
Partager sur d’autres sites

Bonjour

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

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é ;)

Lien vers le commentaire
Partager sur d’autres sites

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

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é ;)

<{POST_SNAPBACK}>

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Il me reste un probleme.

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

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

http://www.my-domain.com/forum/index.php?showtopic=68578

Sur celle ci, elle ne s'applique pas

http://www.my-domain.com/forum/?showtopic=68578

Pour info, j'ai optimise ma regle :

anciene regle :

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

Modifié par invader-u
Lien vers le commentaire
Partager sur d’autres sites

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]

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...