如何确保 Nginx 永远不会缓存某些错误状态?

如何确保 Nginx 永远不会缓存某些错误状态?

我注意到我的 Nginx 代理实例中缓存了一些 406 状态,我想确保这种情况不会再次发生。

我发现一个可能的原因是有人设置了proxy_cache_valid any几分钟的 ,必须将其删除。我目前的理解是,默认情况下不会缓存任何内容,然后如果有proxy_cache_valid,则使用 ,然后如果有任何缓存控制或过期标头,它们将覆盖该设置。

因此,如果我理解正确的话,我认为默认情况下错误不会被缓存,但如果 HTTP 标头覆盖它,则可以缓存它。一种解决方案是通常忽略这些 HTTP 标头。所以,第一个问题是我的理解是否正确。

假设所有这些都是真的,在我的情形下,我想保留此服务器上的缓存控制标头,所以我不想忽略它们。但是,我担心上游甚至可能在错误状态下设置它们。我正在寻找一种解决方案,让我确定这些状态(如 500、503 等)永远不会被缓存。

以下是我对当前解决方案的想法:

http {
    map $upstream_status $never_cache {
        200 0; # Want to receive from cache as in proxy_cache_valid
        301 0; # Want to receive from cache as in proxy_cache_valid
        404 0; # Want to receive from cache as in proxy_cache_valid
        500 0; # Want stale content from proxy_cache_use_stale
        502 0; # Want stale content from proxy_cache_use_stale
        503 0; # Want stale content from proxy_cache_use_stale
        504 0; # Want stale content from proxy_cache_use_stale
        default 1; # Everything else should never be cached
    }

    proxy_cache_valid 200 301 404 10m;
    #proxy_cache_valid any 0s # No active line for this as it's default
    proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

    proxy_no_cache $never_cache;

    ...
}

这些设置合理吗?它会达到我的预期吗?有没有更好的方法来实现这一点?我找不到太多关于如何做到这一点的文档,这让我觉得我错过了一些非常重要的东西。

相关内容