Re: Bug – 304 status - Cache-Control

Maxim Dounin mdounin at mdounin.ru
Sat Jan 4 00:30:18 UTC 2014


Hello!

On Fri, Jan 03, 2014 at 05:37:53PM -0500, S.A.N wrote:

> > Если вы хотите, чтобы оно работало так, то надо включить в ключ 
> > кеширования заголовок If-None-Match - т.к. от него зависит ответ 
> > бекенда.
> 
> Нет, так делать не надо, потому что на один uri может быть только один
> актуальный ETag, новые значения ETag означают обязательную инвалидацию всех
> предыдущих значений ETag для этого uri, т.е если мы ETag добавим в ключ
> кеша, только один ключ будет актуальным все остальные ключи по этому uri,
> будут лежать как мусор потому что они не могут быть актуальными и их нельзя
> отдавать клиенту, значит и смысла их хранить в кеше нет.

Если от заголовка If-None-Match зависит ответ бекенда, то он 
должен быть в ключе кеширования - либо явно, либо неявно (e.g. 
через запрет кеширования ответов на запросы, где этот заголовок 
присутствует).  Что до сопутствующих накладных расходов - то они 
есть повод задуматься о том, нужна ли вам такая схема работы.

> Проблему с кешированием 304 статуса, мы решили ещё проще – бекенд теперь
> проверяет значения If-Modified-Since, если оно пустое, ревалидация не
> проводится, страница будет генерироватся полностью со статусом 200, даже
> если хедер If-None-Match не пустой и является актуальным.
> Это корректное условия для ревалидации клиентского кеширования и для
> кеширования Nginx.

Если значение If-Modified-Since не пустое из-за 
fastcgi_cache_revalidate - то заголовок If-None-Match у вас не 
имеет никакого отношения к тому, что, собственно, ревалидируется.  
И если отдать 304 на основании значения If-None-Match, то в кеше 
nginx'а будет оставлен потенциально устаревший ответ.  Т.е.  
If-None-Match нужно просто убрать из рассмотрения при генерации 
ответа на бекенде, иначе корректной работы не добиться.

Возвращаемся всё к тому же: либо добавлять в ключ кеширования, 
либо ответ бекенда не должн зависеть от If-None-Match.  
Собственно, последнее и происходит по умолчанию при использовании 
кеширования - заголовок If-None-Match из запроса к бекенду 
убирается.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru