[.htaccess] URL rewriting

Eléphanteau du PHP | 47 Messages

03 mai 2009, 17:52

Bonjour,

Je me trouve avec un problème qui me parait très bizarre, voici mon fichier .htaccess

Code : Tout sélectionner

RewriteEngine on RewriteRule ^connexion\.html\?([a-z0-9]+)$ /tuks_0.0.3/index.php?module=membres&action=connexion&SID=$1 [L]
Et quand je vais à l'adresse : http://localhost/tuks_0.0.3/connexion.h ... 0bd7afe314

Je tombe sur une erreur 404, alors que si je supprime le "?" dans le .htaccess et dans mon URL cela fonctionne très bien

Merci d'avance

Mammouth du PHP | 1511 Messages

03 mai 2009, 19:10

Echappe le ? avec un \, car c'est un caractère reservé.

Eléphanteau du PHP | 47 Messages

03 mai 2009, 21:28

C'est la première chose qui m'est venu à l'idée et comme tu peux le voir dans mon expression régulière le "?" est déjà échapper :wink:
C'est très bizarre, je crois que c'est le seul métacaractère qui fou la pagaille.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

03 mai 2009, 21:47

Code : Tout sélectionner

RewriteRule ^connexion\.html\?([a-z0-9]+)$ /tuks_0.0.3/index.php?module=membres&action=connexion&SID=$1 [L] ^ ^ | | celui-là, oui celui-là, non

Eléphanteau du PHP | 47 Messages

03 mai 2009, 21:51

Le seconde chaine n'est pas une expression régulière donc elle n'a pas besoin d'un échappement :wink:

Enfin c'est ce que je vois ici : http://www.yourhtmlsource.com/sitemanag ... iting.html

Et avec l'échappement ça marche pas non plus ;)


EDIT : Après quelques corrections je remarque que le problème vient des parentaises capturantes qui ne capturent rien du tout
Nouveau fichier :

Code : Tout sélectionner

RewriteEngine on RewriteRule ^connexion\.html\??([a-z0-9]{32})?$ /tuks_0.0.3/index.php?module=membres&action=connexion&SID=$1 [L]
EDIT 2 : J'ai voulu tester mon expression rationnel avec un petit script php :
<?php
$chaine = "connexion.html?8290943366f63b94c8e8860bd7afe314";
if (ereg ("^connexion\.html\?([a-z0-9]{32})$", $chaine, $regs)) {
    echo "$regs[1]";
} else {
    echo "Url invalide : $chaine";
}
?>
Et comme je le pensais il me retour la SID, a croire que c'est pas du POSIX :roll:

EDIT 3 : après pas mal de test en tout genre j'ai pu remarquer que le point d'interrogation n'était plus utilisé comme métacaratère, mais tout bonnement supprimé. Vive Apache :D

Après tout pas besoin de faire des URL dans les règles de l'art, un autre délimiteur que "?" peut-être choisi comme le "&".

ViPHP
ViPHP | 3607 Messages

03 mai 2009, 22:44

Bonsoir,
Regarde de ce côté: http://corz.org/serv/tricks/htaccess2.p ... -variables
Je suis pas très calé (j'avais bloqué de la même manière sans pouvoir résoudre la dernière fois...), mais je suis à peu près sur qu'on peu pas capturer "normalement" la query string...

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 mai 2009, 23:29

La query-string ne peut pas être intégrée à l'url rewriting à ma connaissance. Utilise un autre séparateur que "?" ;)

[edit]
L'excellent lien donné par jojolapine semble dire le contraire, et d'après les infos qu'on y trouve, une solution pourrait être de ce genre :

Code : Tout sélectionner

RewriteEngine On # Condition sur l'URL RewriteCond %{REQUEST_URI} ^/connexion.html # Condition sur la query-string, et capture de sa valeur RewriteCond %{QUERY_STRING} ^([a-z0-9]+)$ # Application de la règle RewriteRule connexion\.html(.*)$ tuks_0.0.3/index.php?module=membres&action=connexion&SID=%1 [L]
[/edit]

Eléphanteau du PHP | 47 Messages

04 mai 2009, 19:23

Merci de ta réponse,

Sachant que mes liens peuvent contenir plusieurs données en query string et des fois aucunes.

Je préfère changer de délimiteur, surtout que des conditions multiples avec des expression régulière c'est pas TOP question performance.

Merci de votre aide :D