Подтвердить что ты не робот

Могу ли я использовать запятые в URL-адресе?

Обычно я использую переписывание URL-адресов для передачи идентификаторов контента на мой сайт, поэтому это

 Foo.1.aspx 

перезаписывает

 Foo.aspx?id=1

Для конкретного приложения мне нужно передать несколько идентификаторов на одну страницу, поэтому я переписал все, чтобы принять это:

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

Это отлично работает в Cassini (встроенном специальном веб-сервере для Visual Studio), но дает мне "Internet Explorer не может отображать веб-страницу", когда я пытаюсь запустить его на реальном сервере под управлением IIS. Является ли это ограничением IIS? Должен ли я просто использовать тире или символы подчеркивания вместо запятых?

4b9b3361

Ответ 1

Я помню, что Url Routing по умолчанию сначала проверяет, существует ли файл, а запятые не являются законными в именах файлов, что, вероятно, вызывает ошибки. IIS может иметь устаревший код, который прерывает запрос, прежде чем он сможет перейти на asp.net для обработки.

Скотт Ханзельман сообщение в блоге немного говорит об этом и может быть релевантным для вас.


Как общий комментарий: Url rewriting обычно используется, чтобы сделать URL-адрес дружественным и легко запоминающимся.

~/page.aspx?id=1,2,3,4 не хуже и не лучше ~/page/1-2-3-4.aspx: оба трудно использовать, поэтому зачем прикладывать дополнительные усилия? Избегайте создания новых форм URL-адресов только потому, что вы можете. Пользователи, справочная служба и другие разработчики просто будут смущены.

Перенастройка URL лучше всего использовать для преобразования

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

в

~/products/view/1
~/products/category/beverage

Ответ 2

Запятые разрешены в части имени файла URL-адреса, но являются зарезервированными символами в домене *, насколько я знаю.

Какую версию IE вы используете? Я встретил нечетный отчет об усечении URL-адресов IE5.5 в запятой (здесь, но протестировал URL-адреса с запятыми в IE7, и он Кажется, все в порядке, поэтому, если есть ошибка IE, похоже, что это не так, - может ли это быть проблемой IIS?

Мне интересно, ошибка страницы из-за ошибки правила с mod_rewrite - можете ли вы опубликовать правило, соответствующее нескольким идентификаторам и передающим их на ваш Foo.aspx? Есть ли вероятность, что он будет соответствовать только Foo.N,N и не будет больше запятых?


* Из URI RFC:

2,2. Зарезервированные символы

Многие URI включают в себя компоненты, состоящие или ограниченные определенными    специальные символы. Эти символы называются "зарезервированными", поскольку    их использование в компоненте URI ограничено их зарезервированными    цель. Если данные для компонента URI будут конфликтовать с    зарезервированной цели, тогда конфликтующие данные должны быть экранированы до    формирование URI.

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

"Сдержанный" класс синтаксиса выше относится к тем символам, которые    разрешенных в URI, но которые не могут быть разрешены в пределах    конкретный компонент синтаксиса общего URI

Ответ 3

Попробуйте использовать %2c в URL для замены запятых.

Ответ 4

Заданная запятая разрешена в пути, строке запроса и фрагменте согласно спецификации. Меня не удивило бы, если бы IE не соответствовал спецификации. Попробуйте сущность, как предлагает Клаудиу, но я не знаю, почему это было бы необходимо.

Ответ 5

В дополнение к ответу ConroyP ниже приводится еще одна цитата в RFC. Он отмечает несколько небезопасных символов, но не упоминает запятую (предполагая, что запятая безопасна):

Персонажи могут быть небезопасными по ряду причин. Космос символ небезопасен, поскольку значительные пробелы могут исчезнуть и незначительные пробелы могут быть введены, когда URL-адреса транскрибируются или набирать или подвергать обработке текстовых программ. Символы "<" и " > " являются небезопасными, поскольку они используются как разделители вокруг URL-адресов в свободном тексте; метка кавычки ( "" ) используется для разграничить URL-адреса в некоторых системах. Символ "#" небезопасен и должен всегда кодируется, потому что он используется в World Wide Web и в других системы для разграничения URL-адреса от идентификатора фрагмента/привязки, который может следуйте за ним. Символ "%" небезопасен, потому что он используется для кодировки других персонажей. Другие символы небезопасны, потому что шлюзы и другие транспортные агенты, как известно, иногда изменяют таких персонажей. Этими символами являются "{", "}", "|", "\", "^", "~", "[", "]" и "`".

Все небезопасные символы всегда должны быть закодированы в URL-адресе. Для Например, символ "#" должен быть закодирован в URL-адресах, даже в системы, которые обычно не обрабатывают фрагмент или якорь идентификаторы, чтобы URL-адрес был скопирован в другую систему, которая использует их, нет необходимости изменять кодировку URL.

Ответ 6

Правильный способ приема нескольких идентификаторов выглядит следующим образом:

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

Обратите внимание, что это именно та цель. При повторной написании URL-адресов вы можете в определенной степени установить свои собственные правила для того, что вы хотите, чтобы источник выглядел.

Мне тоже пришлось изучить это на StackOverflow. См. Этот вопрос:
Разделите ints из строки

Ответ 7

Ответ

Проблема заключалась в запятых. Я предполагаю, что у IIS была проблема с ним (а не с IE), так как IE смог показать это на локальном хосте.

Во всяком случае, я просто изменил формат URL-адреса на него, и он отлично работает:

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

Ответ 8

Если вы поставили перед собой контроллер, вы могли бы сделать что-то вроде:

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

Передний контроллер получит имя метода и параметры, которые нужно передать ему. В настоящее время это довольно распространенный метод.