TEST-CMS (Система управления сайтом по технологии AJAX
любое совпадение с реальностью - считать случайным.)


РУБРИКИ: CSS  JavaScript  Web-разработка  Без рубрики  Браузер  История  Кино  Книги  Наука  Новости  Офис  Политика  Происшествия  Путешествия  Техника  Экономика  


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:

  1. URI состоит из ограниченного набора символов (подмножества US-ASCII с кодами 0-127).
  2. Кодировка 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"

Настроек не обнаружено :)

Выводы

По результатам мини-исследования можно браузера награждены званиями:

tags: url  uri  utf-8  utf  браузеры  rfc  3986  3987