2011-01-24 2 views
6

Le mod_rewrite semble convertir le symbole de plus de avant que je dans _REQUEST $, et je ne sais pas quoi réparer ...PHP Mod_rewrite et symboles codés en URL - seuls peuvent utiliser l'un ou l'autre, mais pas les deux?

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,QSA] 

Par exemple, je entrée ceci dans mon URL,

http://mywebsite/invite/xPo8lUEXpqg8bKL%2B32o6yIOK 

je reçois ce,

xPo8lUEXpqg8bKL 32o6yIOK 

mais si je cette demande d'entrée sans passer par le mod_rewrite,

http://mywebsite/invite.php?key=xPo8lUEXpqg8bKL%2B32o6yIOK 

-je obtenir ce que je veux,

xPo8lUEXpqg8bKL+32o6yIOK 

Que puis-je faire? Ou est-ce que je ne peux utiliser que les deux mais pas les deux?

Merci.

+0

Pouvez-vous clarifier ce que vous entrez, et ce que vous obtenez? –

+0

@Pekka: désolé je viens de corriger mes erreurs dans mes écrits ci-dessus et j'ai clarifié mes entrées. Merci. – laukok

+0

+ 1 question intéressante - n'ont jamais rencontré cela auparavant. –

Répondre

3

Essayez d'ajouter [B] drapeau (échapper à des backreferences):

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,B,QSA] 
+1

oui je viens d'essayer mais toujours la même ... :( – laukok

1

Le caractère "+" est réservé dans la partie chaîne de requête d'une URL comme un espace. En fait, le statut "+" en tant que caractère réservé est documenté dans rfc3986 et son utilisation (maintenant héritée) en tant que caractère de remplacement d'espace est documentée dans rfc1630. Apache essaie d'éviter tout conflit, il échappe automatiquement "+" comme une chaîne avant de le transmettre.


Utilisation du drapeau [NE] (NoEscape) sur votre rewrite devrait empêcher que le comportement ne se produise.

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,NE,QSA] 

Cependant, en utilisant ce, sans échappement « + » est remplacé par un espace si les types d'utilisateurs l'URL manuellement. Pour être du bon côté, remplacez simplement tous les espaces dans votre entrée par des signes "+".


Très franchement, puisque vous ne les acceptez pas d'espaces dans votre entrée, il suffit de remplacer tous les espaces avec un symbole « + ». L'utilisation du drapeau [NE] peut faire ressortir des problèmes plus importants puis une simple substitution de caractères. Un simple $_GET['key'] = str_replace($_GET['key'], ' ', '+'); devrait suffire.

+0

merci pour cela.J'ai juste essayé mais toujours pas de chance ... d'autres options s'il vous plaît ...? – laukok

+0

@lauthiamkok: Puisque vous n'acceptez pas d'espaces dans votre entrée , un simple '$ _GET ['key'] = str_replace ($ _ GET ['key'], '', '+');' devrait suffire.Il sera votre seule source d'espaces de toute façon –

+0

merci pour la solution de str_replace :-) – laukok

Questions connexes