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