web-dev-qa-db-fra.com

Puis-je utiliser des virgules dans une URL?

J'utilise généralement la réécriture d'URL pour transmettre des ID de contenu à mon site Web.

 Foo.1.aspx 

réécrit dans

 Foo.aspx?id=1

Pour une application spécifique, je dois passer plusieurs ID sur une seule page, j'ai donc réécrit des choses pour accepter ceci:

 Foo.1,2,3,4,5.aspx

Cela fonctionne bien dans Cassini (le serveur Web ad hoc intégré pour Visual Studio) mais me donne "Internet Explorer ne peut pas afficher la page Web" lorsque je l'essaye sur un serveur en direct exécutant IIS. Est-ce une limitation IIS? Dois-je simplement utiliser des tirets ou des traits de soulignement au lieu de virgules?

33
Herb Caudill

Je me souviens que le routage d'URL par défaut vérifie d'abord si le fichier existe et que les virgules ne sont pas légales dans les noms de fichiers, ce qui explique peut-être pourquoi vous obtenez des erreurs. IIS peut avoir un code hérité qui abandonne la demande avant de pouvoir accéder à asp.net pour le traitement.

blog post de Scott Hanselman en parle un peu et peut être pertinent pour vous.


Comme commentaire général: la réécriture d'URL est généralement utilisée pour rendre une URL conviviale et facile à mémoriser.

~/page.aspx?id=1,2,3,4 n'est ni pire ni meilleur que ~/page/1-2-3-4.aspx: les deux sont difficiles à utiliser, alors pourquoi faire l'effort supplémentaire? Évitez de créer de nouveaux formulaires URL simplement parce que vous le pouvez. Les utilisateurs, le service d'assistance et les autres développeurs seront simplement confus.

La réécriture d'URL est mieux utilisée pour transformer

~/products/view.aspx?id=1
~/products/category.aspx?type=beverage

dans

~/products/view/1
~/products/category/beverage
25
Robert Paulson

Essayez d'utiliser %2c dans l'URL pour remplacer les virgules.

14
Gordon

En plus de la réponse de ConroyP, voici une autre citation à la RFC. Il note un certain nombre de caractères dangereux, mais ne mentionne pas la virgule (suggérant que la virgule est sûre):

Les caractères peuvent être dangereux pour plusieurs raisons. Le caractère d'espace n'est pas sûr car des espaces importants peuvent disparaître et des espaces insignifiants peuvent être introduits lorsque les URL sont transcrites ou composées ou soumises au traitement des programmes de traitement de texte. Les caractères "<" et ">" ne sont pas sûrs car ils sont utilisés comme délimiteurs autour des URL dans le texte libre; le guillemet ("" ") est utilisé pour délimiter les URL dans certains systèmes. Le caractère" # "n'est pas sûr et doit toujours être codé car il est utilisé dans le World Wide Web et dans d'autres systèmes pour délimiter une URL à partir d'un fragment/ancre identifiant qui pourrait le suivre. Le caractère "%" n'est pas sûr car il est utilisé pour les codages d'autres caractères. D'autres caractères ne sont pas sûrs car les passerelles et autres agents de transport sont connus pour modifier parfois ces caractères. Ces caractères sont "{", "} "," | ","\"," ^ "," ~ "," [","] "et" `".

Tous les caractères dangereux doivent toujours être codés dans une URL. Par exemple, le caractère "#" doit être codé dans les URL, même dans les systèmes qui ne traitent pas normalement les identifiants de fragment ou d'ancrage, de sorte que si l'URL est copiée dans un autre système qui les utilise, il ne sera pas nécessaire de modifier le Encodage URL.

5
speedplane

La virgule est autorisée dans le chemin, la chaîne de requête et le fragment selon les spécifications. Cela ne me surprendrait pas si IE n'est cependant pas conforme aux spécifications. Essayez l'entité comme le suggère Claudiu, mais je ne sais pas pourquoi cela serait nécessaire.

3
eyelidlessness

Si vous mettiez en place un contrôleur frontal, vous pourriez faire quelque chose comme;

index.aspx?c=Foo/1/2/3/4

Le contrôleur frontal récupère le nom de la méthode et les paramètres à lui transmettre. C'est une technique assez courante de nos jours.

1
Luke

La bonne façon d'accepter plusieurs identifiants est la suivante:

Foo.aspx?id=1;id=2;id=3;id=4;id=5

Notez que c'est exactement ce que l'objectif est. Lorsque vous réécrivez des URL, vous pouvez définir vos propres règles dans une certaine mesure pour ce à quoi vous voulez que la source ressemble.

J'ai aussi dû l'apprendre sur StackOverflow. Voir cette question:
Séparer les entiers de la chaîne

1
Joel Coehoorn

Répondre

Le problème était les virgules. Je suppose que IIS avait un problème avec lui (pas IE) depuis IE a pu l'afficher correctement sur localhost.

En tout cas, je viens de changer le format d'URL en ceci et cela fonctionne très bien:

Foo.1-2-3-4-5.aspx
1
Herb Caudill