Puis-je utiliser des virgules dans une URL?

j'utilise généralement la réécriture D'URL pour passer des ID de contenu à mon site web, donc ce

 Foo.1.aspx 

réécrit

 Foo.aspx?id=1

pour une application spécifique, j'ai besoin de passer plusieurs ID à une seule page, donc j'ai réécrit des choses pour accepter ceci:

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

cela fonctionne très bien à Cassini (le serveur web intégré ad hoc pour Visual Studio) mais me donne "Internet Explorer ne peut pas afficher la page Web" quand je l'essaie sur un serveur en direct tournant IIS. S'agit-il d'une limitation IIS? Devrais-je utiliser des tirets ou des soulignements plutôt que des virgules?

28
demandé sur Robert Paulson 2008-10-13 22:46:20

8 réponses

je me souviens que le routage D'Url par défaut vérifie d'abord si le fichier existe, et les virgules ne sont pas légales dans les noms de fichiers, ce qui est parhaps pourquoi vous obtenez des erreurs. IIS peut avoir du code d'héritage qui annule la requête avant qu'elle ne puisse atteindre asp.net for processing.

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


Comme commentaire général: la réécriture d'Url est typiquement utilisé pour rendre une url conviviale et facile à retenir.

~/page.aspx?id=1,2,3,4 n'est ni pire ni mieux que ~/page/1-2-3-4.aspx : les deux sont difficiles à utiliser, alors pourquoi passer par l'effort supplémentaire? Évitez de créer de nouvelles formes d'url juste parce que vous le pouvez. Utilisateurs, help desk, et d'autres développeurs seront tout simplement confus.

la réécriture D'Url est mieux utilisée pour transformer

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

en

~/products/view/1
~/products/category/beverage
24
répondu Robert Paulson 2008-10-14 00:44:44
Les virgules

sont autorisées dans la partie nom de fichier D'une URL, mais sont des caractères réservés dans le domaine*, autant que je sache.

quelle version de IE utilisez-vous? J'ai trouvé le rapport bizarre de IE5.5 URLs tronquées sur une virgule ( lien ici , mais ont testé des URLs avec des virgules dans IE7 et il semble être OK, donc s'il y avait un bug IE, il ne semble pas être là plus - pourrait-il être un problème IIS?

je me demande si le l'erreur de page est due à un échec de règle avec le mod_rewrite - pouvez-vous poster la règle qui correspond à plusieurs identifiants et les passer à votre Foo.aspx ? Y a-t-il une chance qu'il ne corresponde qu'à Foo.N,N , et qu'il échoue sur d'autres virgules?


* Du URI RFC :

2.2. Caractères Réservés

beaucoup D'URI comprennent des composants consistant en délimité par, certains caractères spéciaux. Ces caractères sont appelés "réservés", depuis leur utilisation dans le cadre de la composante URI est limitée à leur but. Si les données d'un composant URI entraient en conflit avec but réservé, alors les données en conflit doivent être échappées avant formant l'URI.

 reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","

la classe de syntaxe" réservée " ci-dessus renvoie aux caractères qui sont autorisé dans une URI, mais qui ne peut pas être admis à l'intérieur d'un élément particulier de la syntaxe générique de L'URI

32
répondu ConroyP 2008-10-13 20:07:08

essayez d'utiliser %2c dans L'URL pour remplacer les virgules.

12
répondu Gordon 2015-02-13 11:42:28

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

3
répondu eyelidlessness 2008-10-13 18:53:34

en plus de la réponse de ConroyP, voici une autre citation de 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. Espace le caractère est dangereux parce que les espaces importants peuvent disparaître et des espaces non significatifs peuvent être introduits lorsque les URLs sont transcrites ou typeset ou soumis à un traitement de programmes de traitement de texte. Les caractères "<" et ">" sont dangereux parce qu'ils sont utilisés comme délimiteurs autour des URLs en texte libre; la marque de citation ( "" ) est utilisée pour délimiter les URLs dans certains systèmes. Le caractère "#" est dangereux et doit toujours être encodé parce qu'il est utilisé dans le World Wide Web et dans d'autres des systèmes pour délimiter une URL à partir d'un identificateur de fragment / ancre qui pourrait la suivre. Le caractère "%" est dangereux, car il est utilisé pour codages d'autres caractères. Autre les caractères sont dangereux parce que les passerelles et autres agents de transport sont connus pour parfois modifier de tels caractères. Ces caractères sont "{", "}", "|", "\", "^", "~", "[", "]", et "`".

tous les caractères dangereux doivent toujours être encodés dans une URL. Pour exemple, le caractère "#" doit être codé dans les Url, même dans systèmes qui ne traitent pas normalement de fragment ou d'ancrage identificateurs, de sorte que si L'URL est copiée dans un autre système qui n'utilisez eux, il ne sera pas nécessaire de changer l'encodage d'URL.

3
répondu speedplane 2017-08-10 13:49:51

Le droit chemin accepter plusieurs id est comme ceci:

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

notez que c'est exactement ce que la cible est. En réécrivant les urls, vous pouvez définir vos propres règles dans une certaine mesure pour ce que vous voulez que la source ressemble.

j'ai dû apprendre cela aussi sur StackOverflow. Voir cette question:

séparer les entrées de la chaîne

1
répondu Joel Coehoorn 2017-05-23 12:18:17

réponse

le problème était les virgules. Je devine que IIS avait un problème avec elle (pas IE) depuis IE a été en mesure de l'afficher très bien sur localhost.

en tout cas je viens de changer le format D'URL à ceci et il fonctionne très bien:

Foo.1-2-3-4-5.aspx
1
répondu Herb Caudill 2008-10-13 20:18:46

si vous aviez mis en place un contrôleur avant, vous pourriez faire quelque chose comme:

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

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

1
répondu Luke 2008-10-13 21:22:19