我使用 nginx 作为反向代理proxy_cache
。后端正在设置cache-control
响应标头,这使得 nginx 在可能的情况下从缓存中提供响应。
但是我想通过设置请求标头来允许客户端绕过缓存Cache-Control:max-age=0
。这样用户可以通过CTRL+R
浏览器点击来获取最新副本。默认情况下,nginx 似乎会忽略Cache-Control
请求标头。
如何配置 nginx 以便每当客户端请求资源时从后端获取最新副本并更新缓存Cache-Control:max-age=0
?
答案1
你可以使用proxy_cache_bypass
。
proxy_cache_bypass $http_cache_control;
Cache-Control
这将导致 nginx在客户端的 HTTP 请求中的标头存在的情况下获取文档的最新副本。
请注意,后端生成的响应仍然有资格进行缓存。如果您想取消其缓存资格,请使用相同的参数proxy_no_cache
指令也是如此。
来源:http://wiki.nginx.org/HttpProxyModule#proxy_cache_bypass
Cache-Control: max-age=0
如果您特别希望仅在客户端在标头中包含时绕过缓存(例如,明确不支持另一个变体Cache-Control: no-cache
,这实际上应该是对页面新副本的更强烈偏好max-age=0
),那么您可以使用以下命令,但由于这样的限制,我不建议使用:
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
,所以,原始的单行代码可能会做得最好。
请注意,Cache-Control: max-age=0
当您点击重新加载或者⌘R,Pragma: no-cache\r\nCache-Control: no-cache
当你Shift 重新加载或者⇧⌘R。