7
votes

Comment puis-je passer "/" via URI?

Résolu:

Cet URI fonctionne: p>

/controller/action
/controller/action/par1/aaa
/controller/action/par1/jfhsdajkhfui454fs
/controller/action/par1
/controller/action/par1/


0 commentaires

3 Réponses :


2
votes

Essayez % 2f . Je ne pense pas que urlencode va coder '/' car il est la syntaxe d'URL valide.

[ EDIT ]: Appréciez les votes, mais il semble que ma réponse soit incorrecte. Voir la réponse correcte de Bobince (et beaucoup plus détaillée) Ci-dessous ci-dessus.


0 commentaires

1
votes

0 commentaires

9
votes

Vous le faites presque bien. La seule légère erreur est que urlencode préférera utiliser un plus pour signifier un espace, qui n'est approprié que dans les paramètres de requête et non de la partie de chemin. rawurlencode serait mieux ici.

Cependant, ce n'est pas la raison pour laquelle cela ne fonctionne pas. Vous générez déjà le chemin / contrôleur / action / par1 /% 2f , ce qui est correct.

Cela ne fonctionne pas dans la pratique pour vous car Apache essaie de vous protéger (de manière assez inefficace) des problèmes de traversée de répertoire. Si vous incluez une séquence dans un chemin d'URL, Apache passera par défaut dans et affiche votre propre page 404 (ignorer tout paramètre Errordocument). Pour activer cette fonctionnalité (IMO: erroné) éteint, vous pouvez utiliser le allecendendedslashes < / a> directive de configuration.

Si vous pouvez réellement récupérer la barre oblique codée quand elle revient à votre script est une autre boîte de vers. En raison de la mauvaise conception de la variable path_info dans la spécification CGI d'origine, de nombreux environnements ne seront pas en mesure de voir le % 2f comme étant quelque chose de différent d'un / , un routage potentiellement rupture que vous faites à partir de pièces de chemin.

Il est généralement préférable d'éviter d'avoir des barres obliques dans des pièces de chemin, car Apache n'est pas le seul serveur ou langue qui sera confondu par eux. En général, vous devez utiliser des paramètres de requête pour les entrées où vous devez pouvoir accepter une chaîne d'octets ou de caractères, car les pièces de chemin ont des problèmes pratiques dans de nombreux serveurs avec (a) / (B) code> \ , (c) le caractère nul et (d) cordes vides.


2 commentaires

J'ai effectivement réussi à résoudre ceci en utilisant Uri comme ceci: / contrôleur / action? RET =% 2f :)


Réponse très informative, Bobince. Je n'étais pas familiarisé avec l'option de configuration allowecodeDslashes, moi-même.