Aller au contenu

Sujets conseillés

Posté (modifié)

Bonjour,

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

J'ai cette regle dans mon fichier htaccess:

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:

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:

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:

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

Modifié par ZuckBin
Posté

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)

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 ?

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

Posté

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.

'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 :

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é :D

Posté

Merci pour vos réponses rapide.

J'ai essaye ceci:

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

La page se recharge, mais ne passe pas.

Si je met ceci:

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.

Posté

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

Posté

Pour moi le plus simple est de faire une ligne dans ton .htaccess :

RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et de recherche l'existance de la variable action=process dans la page login.php :

if ($_GET['action']=="process") { ... } else { ... }

Posté
Pour moi le plus simple est de faire une ligne dans ton .htaccess :

RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et de recherche l'existance de la variable action=process dans la page login.php :

if ($_GET['action']=="process") { ... } else { ... }

<{POST_SNAPBACK}>

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.

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.

Posté

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 :

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
}

Posté

Le probleme est que pour valider le formulaire, le lien non rewrité est de la forme

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:

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.

Posté

dans login.php il faut faire :

<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:

Posté

À 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 :

RewriteRule ^se-connecter\.html$ login.php [L,QSA]

Et le formulaire aura pour action :

<form action="se-connecter.htm?action=process" method="get"> ... </form>

Posté

Bonjour,

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

Voici la solution pour mon cas:

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

<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.

Posté

Salut,

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

Dans ta règle:

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 ? :)

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

Posté (modifié)

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.

++

Modifié par ZuckBin
Posté
Bonjour,

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

<{POST_SNAPBACK}>

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.

Veuillez vous connecter pour commenter

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



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