Cache Revalidate

S.A.N nginx-forum at nginx.us
Wed Nov 27 02:07:51 UTC 2013


Есть досадные мелочи, которые хотелось бы исправить, при включении
fastcgi_cache_revalidate on, параметр HTTP_IF_MODIFIED_SINCE, всегда
отправляется на сервер, даже если кеша нет,  бекенду будет отправлен
параметр с пустым значением.

По стандартам HTTP при отсутствии кеша, клиент не должен отправлять
заголовок If-Modified-Since.
Более правильно если Nginx так же как и браузеры, при отсутствии кеша не
будет передавать в бекенд пустой хедер If-Modified-Since, т.е нет кеша нет
хедера, сейчас приходится в конфиге писать 
fastcgi_param HTTP_IF_MODIFIED_SINCE  $upstream_cache_last_modified
if_not_empty;
чтобы пустой хедер не приходил, как этого требует стандарт.

Настроить subsecond ревалидацию в Nginx по стандартам HTTP тоже невозможно.
Если бекенд отдает заголовок
Cache-Control: max-age=0 и/или Expires: -1
Nginx воспринимает их как указания не кешировать ответ, но по стандартам эти
заголовки не запрещают кешировать они указывают клиенту что ответ сервера
можно кешировать, но он сразу же устаревает и следущий запрос должен пройти
ревалидацию, т.е клиент должен каждый запрос отправлять с хедерем
If-Modified-Since.
Мы нашли способ, как заставить Nginx кешировать такие ответы, отправить ему
хедер
X-Accel-Expires: @$time-1 
Тогда Nginx ведет себя правильно, т.е. так же как браузеры, которым
достаточно отправить Cache-Control: max-age=0
Если, есть более красивое решения вместо X-Accel-Expires: @$time-1, хотелось
бы его узнать. 

Во всем остальном ревалидация работает отлично, ждем с нетерпением
реализацию If-None-Match :)
С наличием ETag, будет все очень классно и правильно!

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,244991,244991#msg-244991



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