Summary

  • RFC 2068, опубликованный в январе 1997 года, описывал Accept-Language: браузер мог перечислить приемлемые языки с весами предпочтения.
  • Когда сервер выбирал версию по этому полю, ответ с Vary: Accept-Language сообщал кешу, что при следующем запросе нужно сравнить языковое условие прежде, чем повторно выдать сохранённую страницу.

В RFC 2068 за январь 1997 года есть почти ресторанный заказ: сначала датский, затем британский английский, после — прочий английский. Числа q уточняют предпочтения. Браузер отправляет этот список вместе с адресом, а сервер получает возможность сразу подобрать подходящую страницу. Читателю не требуется вначале открывать отдельное меню языков.

Проблема начинается, когда ответ сохраняет общий кеш. Два человека запрашивают /news. Один предпочитает датский, другой — французский. Сервер может выдать разные тексты по одному и тому же URL. Если кеш запомнил только URL, у него есть готовая страница, но потеряна причина выбора этой версии. Следующему гостю достанется первое попавшееся издание с правильным адресом и неправильным языком.

HTTP добавил пометку Vary. Современный RFC 9110 объясняет: Vary: accept-language отмечает поле запроса, повлиявшее на выбор ответа. RFC 9111 о кешировании обязывает сравнить отмеченные поля с исходным запросом; при несовпадении сохранённый ответ нельзя использовать без повторной проверки. Кеш вправе хранить датскую страницу, но рядом должна лежать карточка с объяснением, кому она предназначалась.

В RFC 9111 описана и прозаическая ошибка: на ответе по умолчанию забыли Vary. Тогда кеш может выбирать эту версию и для дальнейших запросов, хотя доступно более подходящее языковое издание. Никакого сбоя перевода не нужно. Достаточно снять табличку с полки и позволить быстрому работнику действовать вслепую.

Поле Content-Language характеризует языковую аудиторию уже отправленного содержимого. RFC 9110 разводит три смысла: Accept-Language сообщает о предпочтении, Content-Language — о доставленной версии, Vary — об условии её дальнейшей выдачи. Когда эти шаги различимы, ошибку можно искать в конкретном месте маршрута.

Браузер тоже не всегда говорит от имени того, кто сейчас сидит за экраном. Руководство W3C по языковому согласованию приводит пример чужого браузера с прежними настройками и советует видимые переключатели языка. Ещё RFC 2068 отмечал, что полный список предпочтений в каждом запросе раскрывает личные сведения. Нынешний стандарт сохраняет управление этим списком за пользователем.

У веба получилась система обслуживания с четырьмя работниками: браузер предлагает, сервер выбирает, кеш хранит схему рассадки, а читатель может попросить другое издание. Скорость полезна только тогда, когда она обслуживает правильного человека.