Version complète: sur le forum Webmaster Hub : Condition ?
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Fichier .htaccess et réécriture d'URLs
ZuckBin
Bonjour,

J'ai un ptit soucis avec une réecriture d'url.

J'ai cette regle dans mon fichier htaccess:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=$2&%{QUERY_STRING}


Ma page s'appelle comme ceci: se-connecter.html, et elle peu avoir 2 états:

1 se-connecter.html
2 se-connecter.html?action=process

Pour le 1 ca fonctionne, mais pas pour le 2.

Si je met ceci dans mon htaccess:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=process&%{QUERY_STRING}


Ca fonctionne sauf que, mon script se-connecter.html, m'affiche un méssage d'erreur, vu qu'il est codé en sorte.

Si $_GET['action'] == 'process' et si les champs login et pass sont vide, il afiche un méssage d'erreur.

J'aimerai pouvoir appliquer cette regle:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=process&%{QUERY_STRING}


ou quelque chose d'identique, pour qu'aucun méssage d'erreur n'apparaisse, et que l'identification fonctionne correctement.

Dans l'ideal, il faudrait 2 règles, mais je ne sais pas comment faire cohabiter les2:

CODE
RewriteRule ^se-connecter\.html$ login.php [L]
RewriteRule ^se-connecter\.html$ login.php?action=process&%{QUERY_STRING}


j'espere avoir été clair.

Merci de votre aide,
Cordialement
Dan
Déjà ta première règle est fausse, parce que tu n'as pas de référence arrière $2 (ni d'ailleurs de $1)
CITATION
RewriteRule ^se-connecter\.html$ login.php?action=$2&%{QUERY_STRING}


Pour ajouter la QUERY_STRING automatiquement il suffit de mettre le flag [QSA]

De plus, comment veux-tu que ton serveur fasse la différence entre les deux URLs "se-connecter.html" dans ces deux règles ?
CODE
RewriteRule ^se-connecter\.html$ login.php [L]
RewriteRule ^se-connecter\.html$ login.php?action=process&%{QUERY_STRING}

La deuxième règle ne pourra jamais être reconnue parce que la première s'exécutera...

Dan
TheRec
Bonjour,

tu peux utiliser le flag QueryString Append pour les règle ou tu veux que la Query String (ce qui vient après le "?" dans une URL) soit ajouté à la fin de la réécriture.

CITATION
'qsappend|QSA' (query string append)
This flag forces the rewriting engine to append a query string part in the substitution string to the existing one instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.

Source: http://httpd.apache.org/docs/1.3/mod/mod_r...tml#RewriteRule

Donc cela donnerait :
CODE
RewriteRule ^se-connecter\.html$ login.php?action=$2 [L,QSA]

Je n'ai juste pas compris pourquoi tu utilises une back-reference ($2) qui n'existe pas car dans ta règle... tu ne spécifies nulle part de groupe :S

**EDIT** Bon ben grillé... j'aurais du m'en douter Dan était en "Lecture" quand je suis arrivé biggrin.gif
ZuckBin
Merci pour vos réponses rapide.

J'ai essaye ceci:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=$2 [L,QSA]


La page se recharge, mais ne passe pas.

Si je met ceci:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=process [L]


Ca fonctionne, mais j'ai les méssages d'erreur.

J'ai compris pour QSA, par contre pour ceci:

une back-reference ($2) qui n'existe pas car dans ta règle... tu ne spécifies nulle part de groupe :S

J'ai rien compris, c'est quoi une back réference et un groupe dans un htaccess ?

Je ne sais pas trop comment faire fonctionner la regle pour les 2 cas.

Cordialement.
Dan
Les variables de $1 à $9 sont ce qu'on appelle des références arrières.
Elles correspondent aux éléments du premier argument qui sont entre parenthèses.

Par exemple:

RewriteRule article-([0-9]+)\.html article.php?id_art=$1

Dans ce cas le $1 correspond à la première expression se trouvant entre parenthèses: [0-9]+ (il n'y en a qu'une d'ailleurs)

Dan
Compte supprimé
Pour moi le plus simple est de faire une ligne dans ton .htaccess :
CODE
RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et de recherche l'existance de la variable action=process dans la page login.php :
CODE
if ($_GET['action']=="process") { ... } else { ... }
ZuckBin
CITATION(jeroen @ vendredi 21 avril 2006, 14h16)
Pour moi le plus simple est de faire une ligne dans ton .htaccess :
CODE
RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et de recherche l'existance de la variable action=process dans la page login.php :
CODE
if ($_GET['action']=="process") { ... } else { ... }

*


Bonjour,

C'est déja le cas.

Voici la configuration actuelle qui fonctionne, mais j'ai commenter les lignes d'erreurs.

Donc c'est pas indiqué au visiteur si il a fait une erreur de login / et / ou de mot de passe.

La page se recharge simplement.

CODE
RewriteRule ^se-connecter\.html$ login.php?action=process [L,QSA]


Pour le momment j'abandonne, je n'arrive pas à un meilleur résultat.

Si j'enleve le mot "process" de ma regle, ca ne fonctionne plus du tout.

Il doit y avoir autre chose qui interfere, mais je ne sais pas quoi.

Merci de vos réponses.

Cordialement.
Compte supprimé
Alors je ne comprends pas ton problème. Le QSA de ta rewriterule fait passer toutes tes variables, elle sont donc disponibles pour ton script
Dans ton fichier login.php :
CODE
if ($_GET['action']=="process") {
... (test de la validité des $login et $pass, et affichage d'un message d'erreur le cas échéant
}
else {
affichage du formulaire
}
ZuckBin
Le probleme est que pour valider le formulaire, le lien non rewrité est de la forme

CODE
login.php?action=process


pour que cela fonctionne.

Seulement, lorsque c'est rewrité, et que je clique sur le bouton du formulaire,
le lien est de la forme:

CODE
se-connecter.html


Je pense qu'il y a un probleme de ce coté la.

Ou alors, c'est le code du fichier login.php qui est en cause.

Je ne sais plus, je regarderai à nouveau Lundi, de plus, j'ai ce probleme sur d'autres pages, qui fonctionne de la meme maniere.

Cordialement.
Compte supprimé
dans login.php il faut faire :

CODE
<form action="se-connecter.html" method="get">
<input type="hidden" name="action" value="process">
... autres champs de ton formulaire
</form>


apres passer en clair les infos de connexion dans l'url c'est peut être pas super.

Question qui tue : pourquoi as tu besoin d'une rewriterule ?? huh.gif
TheRec
À mon avis..avant de t'attaquer au Rewriting de tes URL assure-toi que sans Rewriting tes script fonctionne...utilises les URL non-réécrites (elle sont bien entendu toujours utilisables, même lorsque le mod_rewrite est utilisé).

Une fois que tu es sûr de tes scripts réflechis quelles sont les URL qui on besoin d'être réécrites et en quoi elle doivent être réécrites. Si dans ton cas ton but est que lorsque quelqu'un demande la page d'identification avec "se-connecter.html" il soit dirigé vers "login.php" et qu'une fois le formulaire envoyé il soit dirigé vers "se-connecter.html?action=process" voici la règle qui devra être utilisée dans le .htaccess :
CODE
RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et le formulaire aura pour action :
CODE
<form action="se-connecter.htm?action=process" method="get"> ... </form>
ZuckBin
Bonjour,

Merci pour vos conseils, apres un petit week end au calme, ca va toujours mieux.

Voici la solution pour mon cas:

CODE
RewriteRule ^se-connecter\.html$ login.php?action=$2 [L,QSA]


CODE
<form action="se-connecter.html?action=process" method="post">


Cela fonctionne, et c'est le principal.

J'utilise toute une classe et des fonctions que je ne maitrise pas, qui ont été écrite par un autre, ca doit etre pour ca que cela ne fonctionne pas comme d'habitude.

Merci,
Cordialement.
Dan
Salut,

Tu ne sembles pas maîtriser la réécriture non plus, si je puis me permettre cette remarque.

Dans ta règle:
CODE
RewriteRule ^se-connecter\.html$ login.php?action=$2 [L,QSA]

dis-moi où Apache peut bien aller chercher la référence arrière $2 ? smile.gif

Si ça "marche", tant mieux. Mais dans ce cas on dira plutôt que "c'est tombé en marche" parce que ta règle est fausse. C'est donc ton script login.php qui ne traite pas correctement ses variables parce que là tu lui envoies une variable $_GET['action'] qui est nulle.

Dan
ZuckBin
Bonjour,

J'ai bien compris pour la réference arriere $2.

J'utilise le script de Chemo: Ultimate SEO URLs Contribution.

Sur toute ces règles, il applique le $2, sinon cela ne fonctionne plus.

Il doit forcement y avoir un autre paramètre qui passe avant, c'est pour cela qu'il passe ses variables en 2eme position, je suppose.

Voila.
++
TheRec
CITATION(ZuckBin @ lundi 24 avril 2006, 14h07)
Bonjour,
Sur toute ces règles, il applique le $2, sinon cela ne fonctionne plus.
*

Les références arrières (back-references) sont dépendantes de l'expression régulière sur lasquelle elles portent...c'est à dire que même si une référence $2 avait été attribuée lors d'une autre RewriteRule, elle ne sera pas accessible dans une règle suivante.

Maintenant il est possible que dans de Chemo, un test "isset" sur la variable "action" soit effectué...dans ce cas tu peux toujours soit modifier le code et utiliser un "!empty($_GET['action'])" à la place... ou encore enlever le $2 et laisser login.php?action= ... Mais utiliser une référence arrière qui n'existe pas n'est pas sain...si ton schéma d'URL vient à évoluer, tu risques d'avoir des surprises.
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.