HTTP, RFC 3986 и браузеры
2010-04-02 17:23:50 Рубрика : Web-разработка
Протокол HTTP 1.1 описан в документе rfc2616, в котором так же вводится понятия absoluteURI и abs_path, определение которых описано в rfc2396 «Uniform Resource Identifiers (URI): Generic Syntax», замененный в 2005 году rfc3986 «Uniform Resource Identifier (URI): Generic Syntax».
Хочу обратить внимание на две вещи, которые описаны в rfc3986:
- URI состоит из ограниченного набора символов (подмножества US-ASCII с кодами 0-127).
- Кодировка UTF-8 является предпочтительной перед другими, т.к. новые схемы URI должны представляться в универсальной кодировке UTF-8 (When a new URI scheme defines a component that represents textual data consisting of characters from the Universal Character Set [UCS], the data should first be encoded as octets according to the UTF-8 character encoding).
Так же, документ rfc3987 определяет понятие IRI (Internationalized Resource Identifier), которые отличаются от URI возможностью включения unicode-символов в свой состав, определяет отображение IRI в URI с использованием UTF-8. Одним из очевидных местом использования IRI является адресная строка браузера, куда можно вводить ссылку с национальными и прочими символами, не входящими в US-ASCII.
На практике, браузеры могут отступать от требований, что показано ниже.
Internet Explorer
Одним из интересных случаев является Internet Explorer, включая последнюю восьмую версию.
Если в адресной строке набрать адрес вида localhost/проверка?data=связи, то серверу будет отправлена строка:
"GET /%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0?data=xf1xe2xffxe7xe8 HTTP/1.1"
Как видно, часть адреса IE закодировал в UTF-8 и представил в процентном виде. Такое представление управляется опцией «Отправлять URL-адреса в UTF-8», которая включена по-умолчанию.
А вторую часть (query part) представил в кодировке CP1251 и отправил «как есть» (что, вообще говоря, не соответсвует стандарту). Описание такого поведения найти не удалось, кроме фразы из файла Readme.txt к Internet Explorer:
The query part of URLs is transmitted in a form fully compatible
with Internet Explorer 4 and above.
т.е. такое поведение основано на совместимости со старыми реализациями браузера и сайтов.
Firefox
Далее, проверка Firefox на упомянутой выше строке дает результат:
"GET /%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0?data=%F1%E2%FF%E7%E8 HTTP/1.1"
Первая часть запроса закодировалась в UTF-8 и было представлено в процентном виде. Такое поведение (представление в UTF-8) управляется опцией network.standard-url.encode-utf8, включенной по-умолчанию.
Вторая часть представлена в кодировке CP1251 с процентным представлением. Кодированием в UTF-8 управляет опция network.standard-url.encode-query-utf8, которая выключена по-умолчанию.
Настройка опции продиктована совместимостью со старыми сайтами, а кодировка может определяться корировкой самой страницы.
Обсуждение на эту тему можно посмотреть по ссылкам:
http://kb.mozillazine.org/Network.standard-url.encode-utf8
http://kb.mozillazine.org/Network.standard-url.encode-query-utf8
https://bugzilla.mozilla.org/show_bug.cgi?id=284474
Google Chrome
Проверка Google Chrome не показала ничего интересного, строка полностью закодировалась в UTF-8 и была представлена в процентном виде:
"GET /%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0?data=%D1%81%D0%B2%D1%8F%D0%B7%D0%B8 HTTP/1.1"
Настроек не обнаружено :)
Выводы
По результатам мини-исследования можно браузера награждены званиями:
- Google Chrome — самый правильный
- Firefox — самый приспосабливаемый
- Internet Explorer — самый…