![如果 URL 变为不可缓存,proxy_cache_bypass 将继续提供旧的缓存响应](https://linux22.com/image/772671/%E5%A6%82%E6%9E%9C%20URL%20%E5%8F%98%E4%B8%BA%E4%B8%8D%E5%8F%AF%E7%BC%93%E5%AD%98%EF%BC%8Cproxy_cache_bypass%20%E5%B0%86%E7%BB%A7%E7%BB%AD%E6%8F%90%E4%BE%9B%E6%97%A7%E7%9A%84%E7%BC%93%E5%AD%98%E5%93%8D%E5%BA%94.png)
正常情况下,使用时proxy_cache_bypass
nginx 会从上游获取一份新的副本,并用新的副本覆盖缓存的响应。
但是,如果 URL 从可缓存变为不可缓存的响应(例如,变为带有 的 4xx 响应Cache-Control: no-cache
),那么使用proxy_cache_bypass
确实会从上游提供全新的副本,但它会将旧副本保留在缓存中。
这意味着每次请求 URL 时如果没有触发proxy_cache_bypass
,它将继续提供旧的缓存。
我猜这是一种有意的行为,因为proxy_cache_bypass
只有覆写通过保存新的响应来缓存响应,而no-cache
响应意味着没有任何内容可保存?这是怎么回事?
我该如何解决这个问题?我不想为 4xx 响应启用缓存...
我正在运行 nginx/1.14.2
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my-cache:70m max_size=28g inactive=1d;
proxy_temp_path /var/cache/nginx/tmp;
proxy_cache my-cache;
proxy_cache_key $remote_user$scheme$host$request_uri;
proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504 http_429;
proxy_cache_bypass $http_cache_control;
proxy_read_timeout 90;
add_header X-Cache-Status $upstream_cache_status;
etag off;
答案1
你可以通过指定来告诉 nginx 仅缓存 200、301 和 302 响应
proxy_cache_valid 10m;
这告诉 nginx 缓存有效响应十分钟。
答案2
这是预期的行为。这就是为什么他们希望你使用付费版本来获得proxy_cache_purge指示