RFC 2616 с Apache 2.4

Я использую Apache 2.4.3 в качестве обратного прокси-сервера из-за заявленного соответствия RFC 2616. Мое приложение использует такие заголовки, чтобы включить кэширование на прокси-сервере:

Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: A
Vary: X-Group
ETag: W/"foo1"

После того, как первый запрос согревает кеш, если мое приложение изменится, чтобы ответить так:

Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: B
Vary: X-Group
ETag: W/"foo2"

Приложение ответит 304 Not Modified, если заголовок If-None-Match из Apache соответствует сгенерированному из источника ETag. Однако Apache затем кэширует второй ответ 200 и заменяет запись "foo1" новым ответом вместо кэширования обоих ответов с разными ETag. Поэтому вместо If-None-Match: W/"foo1", W/"foo2" следующий запрос на повторную проверку If-None-Match: W/"foo2", Таким образом, кэш постоянно получает промахи, а не всегда получает хиты.

Из RFC 2616 раздел 12.1:

Однако исходный сервер не ограничен этими измерениями и МОЖЕТ изменить ответ на основании любого аспекта запроса, включая информацию за пределами полей заголовка запроса или в пределах полей заголовка расширения, не определенных в этой спецификации.

Я пробовал следующие комбинации для Vary:

Vary: X-Foo
Vary: *
Vary: User-Agent

Я также пробовал как сильные, так и слабые ETag, и независимо от того, что я не могу заставить Apache кешировать два ответа одновременно, он всегда сохраняет предыдущий. Если он не может сохранить более одной дисперсии страницы, то ETag бесполезен, Last-Modified будет так же хорош.

Из документов Apache 2.4:

В mod_cache реализован RFC 2616-совместимый фильтр кэширования содержимого HTTP с поддержкой кэширования согласованных ответов содержимого, содержащих заголовок Vary.

Обратите внимание, что там написано "ответы" во множественном числе. Я неправильно интерпретирую HTTP-спецификацию или Apache 2.4 все-таки не полностью поддерживает ETag?

1 ответ

Решение

Вы приводите пару примеров, таких как это:

Cache-Control: public, s-maxage=0
Expires: ... (+1 day)
X-Group: A
Vary: X-Group
ETag: W/"foo1"

Я замечаю, в частности, Vary: X-Group заголовок. Является X-Group заголовок запроса или заголовок ответа?

Согласно RFC 2616, раздел 14.44, Vary должен перечислить любые заголовки запроса, которые приведут к другому представлению контента от исходного сервера. Из вашего примера я подозреваю X-Group Это может быть заголовок ответа, в этом случае mod_cache не будет хранить несколько версий данного ресурса.

Одна вещь, которую вы могли бы попробовать, это установить Vary: If-None-Match, что позволило бы mod_cache хранить версию ресурса для каждого ETag. Правда, я этого не пробовал. Предполагая, что это работает, одним недостатком является то, что первый запрос от любого клиента будет отсутствовать в кеше.

Другие вопросы по тегам