2010-10-21 3 views
8

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

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

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

+0

Никогда не рассматривал это раньше, будет интересно увидеть правильный ответ на этот хороший вопрос. – Dave

ответ

4

Только в строке запроса: знак плюса является зарезервированным символом, поэтому он должен быть закодирован для передачи фактического «+» в пути или в строке запроса. Это использует в качестве замены для пространств является W3C Recommendation, который относится только к строке запроса:

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

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

При сравнении двух 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 "/". 

другие, чем те, в «зарезервировано» и «Unsa Персонажи fe "(см. RFC 2396 [42]) эквивалентны их кодировке "% "HEX HEX".

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

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

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

+1

В цитируемом разделе говорится: «** В строке запроса ** знак плюса зарезервирован как сокращенная запись для пробела». Внутри строки запроса это не то же самое, что и внутри url в целом. В общем случае ответ отрицательный, однако может быть – Davy8

+1

В примере OP 'http: // www.example.org/hello% 20world' и' http: // www.example.org/hello + world' Раздел, который вы цитируете, не применяется, поскольку он не является частью строки запроса. – Davy8

+0

@ Davy8 - Думаю, ты меня набросила на правильный ответ :) –

Смежные вопросы