Назад | Перейти на главную страницу

Настройте nginx для запросов max-age = 0

Я использую 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.