Я использую nginx как обратный прокси с proxy_cache
. Серверная часть настраивается cache-control
заголовки ответов, которые заставляют nginx по возможности обслуживать ответы из кеша.
Однако я хотел бы разрешить клиентам обходить кеш, установив заголовок запроса Cache-Control:max-age=0
. Таким образом, пользователи могут получить новую копию, нажав CTRL+R
в браузере. По умолчанию nginx игнорирует Cache-Control
заголовок запроса.
Как я могу настроить nginx для получения новой копии из серверной части и обновления кеша всякий раз, когда клиент запрашивает ресурс с помощью Cache-Control:max-age=0
?
Вы могли бы использовать proxy_cache_bypass
.
proxy_cache_bypass $http_cache_control;
Это заставит nginx получить новую копию документа при наличии Cache-Control
заголовок в HTTP-запросе от клиента.
Обратите внимание, что полученный ответ от серверной части по-прежнему подлежит кэшированию. Если вы хотите запретить его кеширование, используйте те же аргументы с proxy_no_cache
директива тоже.
Источник: http://wiki.nginx.org/HttpProxyModule#proxy_cache_bypass
Если вы специально хотите обойти кеш только тогда, когда у клиента Cache-Control: max-age=0
в заголовках (например, чтобы явно не поддерживать другой вариант, Cache-Control: no-cache
, что на самом деле считается более сильным предпочтением новой копии страницы, чем max-age=0
is), то вы можете использовать следующее, что я не буду рекомендовать из-за такого ограничения:
set $cc_ma 0;
if ($http_cache_control = "max-age=0") { # honour ⌘R, ignore ⇧⌘R (yes, bad idea!)
set $cc_ma 1;
}
proxy_cache_bypass $cc_ma;
Кстати, есть также Pragma: no-cache
, который, очевидно, не учитывается, хотя в моем ограниченном наборе экспериментов он всегда сопровождается Cache-Control: no-cache
, так что исходный однострочник, вероятно, подойдет лучше всего.
В качестве примечания SeaMonkey отправляет Cache-Control: max-age=0
когда вы нажимаете Перезагрузить или ⌘R, и Pragma: no-cache\r\nCache-Control: no-cache
когда ты сдвиг Перезагрузить или ⇧⌘R.