Совпадают ли% 20 и + в URL-адресе http?

Я знаю, что% 20 и + декодируются в одно и то же двоичное значение (пробел), и для большинства веб-серверов, особенно тех, которые сопоставляются с физическими файлами, они будут указывать на один и тот же ресурс.

Но мой вопрос в том, должен ли URL-адрес типа http://www.example.org/hello%20world укажите на тот же ресурс, что и http://www.example.org/hello+world, они канонически одинаковы?

В HTTP / 1.0 + не отображается пробел, поэтому я специально спрашиваю о HTTP / 1.1.


person Evert    schedule 21.10.2010    source источник
comment
Никогда раньше не задумывался об этом, будет интересно увидеть правильный ответ на этот красивый вопрос.   -  person Dave    schedule 22.10.2010


Ответы (1)


Только внутри строки запроса: знак плюса является зарезервированным символом, поэтому его необходимо закодировать, чтобы передать фактический "+" либо в пути, либо в строке запроса. Его использование вместо пробелов - это рекомендация W3C, которая применима только к запросу. нить:

В строке запроса знак плюса зарезервирован как сокращенное обозначение пробела. Следовательно, действительные знаки плюса необходимо кодировать. Этот метод использовался, чтобы упростить передачу URI запросов в системах, в которых не допускались пробелы.

Сравнение URI (RFC 2616):

При сравнении двух URI, чтобы решить, совпадают они или нет, клиент ДОЛЖЕН использовать октетное сравнение всех URI с учетом регистра с учетом следующих исключений:

  - A port that is empty or not given is equivalent to the default
    port for that URI-reference;

    - Comparisons of host names MUST be case-insensitive;

    - Comparisons of scheme names MUST be case-insensitive;

    - An empty abs_path is equivalent to an abs_path of "/".

Символы, отличные от символов в "зарезервированных" и "небезопасных" наборах (см. RFC 2396 [42]), эквивалентны своей кодировке ""% "HEX HEX".

Зарезервированные символы (RFC 2396)

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

Итак, о третьем обходе: нет ничего официального, что заявляло бы, что это одно и то же. Буквальное использование '+' для направления http://example.org/hello+world в каталог с именем hello+world неверно, но нет ничего, что говорило бы, что его следует рассматривать как эквивалент пробела.

person Brad Mace    schedule 21.10.2010
comment
В разделе, заключенном в кавычки, говорится: Внутри строки запроса знак плюса зарезервирован как сокращенное обозначение для пробела. Внутри строки запроса - это не то же самое, что внутри URL-адреса в целом. В общем случае ответ отрицательный, однако это может быть - person Davy8; 22.10.2010
comment
В примере OP http://www.example.org/hello%20world и http://www.example.org/hello+world Раздел, который вы процитировали, не применяется, потому что он не является частью строки запроса. - person Davy8; 22.10.2010
comment
@ Davy8 - я думаю, вы меня сейчас подтолкнули к правильному ответу :) - person Brad Mace; 22.10.2010