2009-01-25 5 views
0

Je construis une application PHP en utilisant CodeIgniter. Il est similaire à Let Me Google That For You où vous écrivez une phrase dans une zone de saisie de texte, cliquez sur soumettre, et vous êtes redirigé vers une URL qui affiche le résultat. Je voulais que l'URL soit modifiable par l'homme et relativement simple. J'ai eu dans le routage d'URL CodeIgniter, donc en ce moment mes URL peuvent ressembler à ceci:Problème avec l'encodage des caractères spéciaux pour l'URL via la saisie de texte

http://website.com/?q=this+is+a+normal+url 

Le problème est en ce moment quand la phrase contient un caractère spécial comme un point d'interrogation, ou une barre oblique inverse. Ces deux désordre avec mes règles de réécriture actuelles, et cela arrive même lorsque le personnage est encodé.

http://website.com/?q=this+is+a+normal+url? OR 
http://website.com/?q=this+is+a+normal+url%3F 

Qu'est-ce que le travail est le double-codage. Par exemple, si je prends le point d'interrogation, et l'encoder à %253F (où le? Est codé à% 3F et le signe% est codé à% 25). Cette URL fonctionne correctement.

http://website.com/?q=this+is+a+normal+url%253F 

Quelqu'un at-il une idée de ce que je peux faire ici? Y a-t-il une façon intelligente de doubler l'encodage de l'entrée? Puis-je écrire une règle de réécriture .htaccess pour contourner ce problème? Je suis à perte ici. Voici les règles de réécriture que j'utilise actuellement pour tout le monde.

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^q=(.*)$ 
RewriteRule ^(.*)$ /index.php/app/create/%{QUERY_STRING}? [L] 

Remarque: La façon dont fonctionne CodeIgniter est qu'ils ont une configuration d'URL index/application/function/parameter. J'alimente la fonction la chaîne de requête complète en ce moment.

+0

Pouvez-vous ajouter votre règle de réécriture à la question? – Greg

+0

Bien sûr, le message original a été modifié pour inclure les règles de réécriture. –

+0

Est-il nécessaire de rediriger la demande de cette façon? – Gumbo

Répondre

1

Si en utilisant Apache 2.2 Vous êtes en train et plus tard, vous pouvez utiliser le B flag pour forcer la référence arrière à être échappé:

RewriteCond %{QUERY_STRING} ^q=.* 
RewriteRule^/index.php/app/create/%0? [L,B] 
+0

Merci! J'ai changé le fichier .htaccess pour utiliser ce que vous aviez et cela a fonctionné exactement comme j'avais besoin. Je voterais sur vos points de réputation si j'en avais. –

0

que je fais habituellement urls lisibles par l'homme comme celui-ci

$humanReadableUrl= implode("_",preg_split('/\W+/', trim($input), -1, PREG_SPLIT_NO_EMPTY)); 

Il supprime tous les caractères non-mot et ajouter underscores beetween mots

+0

Malheureusement, des choses comme la ponctuation sont nécessaires pour l'application (les utilisateurs vont vouloir mettre dans les exclamations, les points et les points d'interrogation). –

Questions connexes