#http #http-headers #internationalization #http2
#http #http-заголовки #интернационализация #http2
Вопрос:
В браузере Mac OS Chrome (v87), когда я делаю HTTP-запрос, я вижу заголовок Accept-Language следующим образом:
accept-language: en-US,en;q=0.9,es;q=0.8,es-MX;q=0.7
В браузере Mac OS Safari (версия 13.1.3), когда я делаю тот же HTTP-запрос, я вижу заголовок Accept-Language следующим образом:
Accept-Language: en-us
Мой вопрос в том, верны ли оба вышеуказанных формата? Разница между прописными ‘en-US’ и строчными ‘en-us’ фактически привела к ошибке в некотором коде маршрутизации.
Ответ №1:
Да, оба приведенных вами примера соответствуют указанному синтаксису для Accept-Language
заголовка.
Этот синтаксис явно изложен в RFC 7231. Проще говоря, значение представляет собой разделенный запятыми список языковых тегов, где за каждым тегом необязательно следует точка с запятой и вес ( ;q=...
), указывающий желательность языка.
В спецификации явно указано, что сравнения должны выполняться без учета регистра, поэтому любой «код маршрутизации», который приводит к различному поведению в зависимости от регистра, не соответствует спецификации HTTP.
Языковые теги и, следовательно, языковые диапазоны должны рассматриваться как нечувствительные к регистру: существуют соглашения для заглавных букв некоторых подтегов, но они НЕ ДОЛЖНЫ восприниматься как имеющие значение. Сопоставление языковых тегов с языковыми диапазонами ДОЛЖНО выполняться без учета регистра.
Ответ №2:
В качестве продолжения этого вопроса. Строка языковой локали в нижнем регистре может быть допустимой в соответствии с HTTP. Но это было подтверждено как ошибка в WebKit.
Комментарии:
1. Спасибо за ответ. Чтобы уточнить, ошибка связана не с заголовком HTTP, а с DOM API. В частности, значение
window.navigator.language
должно использовать код страны в верхнем регистре.