HTTP Redirect of Cyrillic URLs: this example works without URLs being encoded. Why?

As per the https://tools.ietf.org/html/rfc5987, HTTP header fields should be returned using the ISO-8859-1 character encoding.

This applied also to the Location field used for the redirection. However, looking at the following example, I can't figure out how the redirect work despite the URL is not encoded.

http://goo.gl/m5fDF0

I ran different tools including the Google Chrome Developer, and the location field is definitely is encoded, but using a CURL or software like Screaming Frog return a location written with cyrillic characters. In theory the redirect should resolve in a 404, but I got a 200.

Any idea of how this is possible?

1
задан 18 March 2016 в 13:09
1 ответ

Да, на самом деле перенаправление содержит октеты, длина которых превышает 7 бит (больше, чем шестнадцатеричный код 0x80). Различные приложения преобразуют эти октеты в различное визуальное представление на вашем экране; это зависит от того, какую кодировку они решат использовать.

Если кто-то будет использовать UTF-8, он, скорее всего, получит хороший кириллический текст, но это случайно; не по теме вопроса.

https://tools.ietf.org/html/rfc7230#section-3.2 довольно точно заявляет, что:

Исторически HTTP разрешал содержимое поля с текстом в
Кодировка ISO-8859-1 [ISO-8859-1], поддерживает только другие кодировки
за счет использования кодировки [RFC2047]. На практике большинство HTTP-заголовков
значения полей используют только подмножество кодировки US-ASCII [USASCII].
Вновь определенные поля заголовка ДОЛЖНЫ ограничить их значения поля до
Октеты US-ASCII. Получателю СЛЕДУЕТ обработать других октетов в поле
content (obs-text) в виде непрозрачных данных.

и

obs-text =% x80-FF

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

Но сервер, который получает данные в сеансе HTTP, также может использовать октеты для своих операций, что не требует , но отображения любого визуального представления на любом экране. В этом случае HTTP-сервер использует октеты для обслуживания страницы. Поскольку HTTP-сервер просто получает некоторые октеты ввода и производит некоторые октеты вывода, "кодировка" здесь не применяется (HTTP-серверу никогда не нужно преобразовывать байты во что-то, что он показывает на экране или на принтере).

1
ответ дан 3 December 2019 в 23:49

Теги

Похожие вопросы