Cloudflare объявила о доступности поддержки заголовка ответа HTTP Vary в функции Cache Rules для всех своих тарифов, включая Free, Pro, Business и Enterprise. Это расширение предоставляет администраторам сайтов больше контроля над тем, как сеть обрабатывает запросы, которые могут приводить к нескольким представлениям одного и того же ресурса, например из-за различий в языке, формате изображений, типе содержимого или способе сжатия.
Исходный сервер с помощью Vary указывает заголовки запроса, способные влиять на ответ, однако этот заголовок не поясняет, приводят ли все текстовые различия между значениями этих заголовков к действительно разным ответам. Поэтому система кэширования может считать близкие значения независимыми версиями, разделяя содержимое на большое количество элементов с низкой повторной используемостью.
Три способа обработки различий
Cloudflare предоставляет для каждого заголовка, указанного источником в Vary, одно из трёх действий:
- normalize: нормализация значений перед выбором сохраненной версии; это рекомендуемый вариант для заголовков согласования, таких как Accept, Accept-Language и Accept-Encoding, когда множество значений сводится к ограниченному числу ответов.
- passthrough: использование исходного значения, включая регистр, пробелы, порядок и повторяющиеся значения, когда точное различие влияет на ответ.
- bypass: отказ от сохранения ответа, если указанный в Vary заголовок является персональным или имеет большое количество вариантов, например Cookie или User-Agent.
При этом Vary: * всегда приводит к обходу кэширования, поскольку любая часть запроса, включая информацию за пределами HTTP-сообщения, например IP-адрес, может влиять на выбор источником ответа.
Что меняется на практике?
При использовании нормализации запросы, различающиеся по форме, но предпочитающие один и тот же результат, могут совместно использовать сохраненную версию. Cloudflare сводит значения Accept, Accept-Language и Accept-Encoding к единому формату: записывает значения строчными буквами и сортирует их по приоритету качества, а при равенстве — в алфавитном порядке. Администратор также может указать поддерживаемые типы медиаданных или языки, например text/html и application/json либо en, fr и de.
Однако такое поведение может устранить различия, необходимые источнику. Cloudflare отмечает, что значения q=0 или некоторые исключения для языков могут быть потеряны при сокращении, поэтому следует использовать passthrough, если источнику необходимо видеть эти исключения в том виде, в каком их отправил клиент. Передача исходных значений также может вернуть проблему фрагментации: значения вроде compact,full и compact, full могут создавать разные ключи кэширования, даже если источник считает их эквивалентными.
Ответственность источника и ограничения обновления
Источник должен последовательно возвращать Vary с каждым доступным для кэширования ответом, который может различаться в зависимости от заголовков запроса, включая резервные ответы и ошибки. Если в одном из ответов отсутствует соответствующий заголовок, Cloudflare может сохранить этот ответ без требуемого разделения.
Изменение настроек Vary не приводит к автоматическому удалению существующего содержимого: старые записи могут сохраняться до истечения срока действия или выполнения операции purge. Настройка Vary также не заменяет пользовательский ключ кэширования во всех случаях: Cloudflare рекомендует использовать пользовательский ключ, когда свойство запроса является постоянной частью идентичности ресурса, и использовать Vary, когда источник в ответе объявляет поля, которые действительно на него влияют.
Почему эта новость важна?
Обновление решает практическую дилемму в CDN-сетях: игнорирование Vary может привести к отправке клиенту неправильного формата или языка, тогда как буквальная обработка каждого значения может снизить коэффициент попаданий в кэш и увеличить число запросов к источнику. Согласно материалу, анализ более 120 миллионов ответов примерно с 50 тысяч популярных сайтов показал, что около 3 тысяч сайтов используют различия по четырём или более полям, а некоторые — по 10, 23 или 47 полям.
Преимущество по-прежнему зависит от качества определения источником предоставляемых представлений и выбора подходящего действия для каждого заголовка. Настройки доступны через панель Cloudflare, Rulesets API или Terraform; после развертывания необходимо протестировать различные значения и отслеживать CF-Cache-Status.