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.
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?
Да, на самом деле перенаправление содержит октеты, длина которых превышает 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-серверу никогда не нужно преобразовывать байты во что-то, что он показывает на экране или на принтере).