Ключи строки запроса чувствительны к регистру?

Предположим, у меня есть такой URL:

http://www.example.com?key=123&KEY=198

Тогда что будет результатом

request.querystring("key")

and 

request.querystring("KEY")

Я немного смущен.

3 ответа

Решение

RFC для URI говорит:

6.2.2.1. Нормализация случая

Когда URI использует компоненты общего синтаксиса, всегда применяются правила эквивалентности синтаксиса компонентов; а именно, что схема и хост не чувствительны к регистру и поэтому должны быть нормализованы к строчным. Например, URI эквивалентен http://www.example.com/.

Предполагается, что другие компоненты общего синтаксиса чувствительны к регистру, если в схеме не указано иное (см. Раздел 6.2.3).

Обратите внимание, что схема (здесь "http"), host (имя сервера) нечувствительны к регистру, но в любом случае должны быть строчными. Остальное зависит от регистра, если вы не используете другую схему, которая явно говорит, что она должна быть нечувствительной.

Таким образом, ключ и KEY - это разные вещи во всех основанных на http URI в соответствии со спецификацией.

Ответ @gbjbaanb неверен: в RFC указывается только разрешенный набор символов для строки запроса. Как и компоненты пути и фрагмента URI, компонент URI запроса имеет значение только для полномочий, предоставляющих ресурс.

Это полностью зависит от того, является ли этот материал чувствительным к регистру или нет.

В случае C# и IIS резервное хранилище для проанализированной строки запроса в HttpRequest объект является System.Collections.Specialized.NameValueCollection что происходит без учета регистра (по умолчанию).

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

Кроме того, поскольку сама страница (и JavaScript на стороне клиента) имеют доступ к необработанному URI, они могут делать с ней все, что захотят.

Если строка запроса создается в результате отправки формы HTML, ключи (имена) берутся из значения элементов управления формы name атрибут, который, согласно спецификации HTML, чувствителен к регистру. Но насколько я знаю, никто на самом деле не делает этого.

Итак, в конце дня вы должны знать, что ожидает обработчик запросов в строке запроса. Это может (или не может) быть чувствительным к регистру.

Короче говоря, они считаются равными во многих языках программирования.

Различные части URL-адреса отличаются чувствительностью к регистру:

  • Протокол (http) - без учета регистра
  • Имя хоста (example.com) - без учета регистра
  • Путь (/folder/document.html) - с учетом регистра
  • Ключ строки запроса (? Fuzz=bar OR?FUZZ=bar) - без учета регистра
  • Значение строки запроса (? Fuzz=bar&buzz=BAR) - с учетом регистра

Согласно Hurl.it, key будет равен 123 а также KEY, 198, Они будут доступны в виде двух разных строк запросов.

Другие вопросы по тегам