如何使用 NGINX 中的“Vary: Cookie”标头避免疯狂缓存

如何使用 NGINX 中的“Vary: Cookie”标头避免疯狂缓存

Vary: Cookie知道不太受欢迎,因为它会导致缓存用户可能报告的每种 cookie 变体。另一方面,如果没有它,我不得不使用Cache-Control: no-cache来告诉我的 NGINX 缓存服务器完全跳过缓存内容可能让用户登录(顺便说一下,我的网站的每个页面都是登录的,因为页面顶部有一个帐户框)。

我只在用户登录时发送 cookie,因此大多数页面浏览量都会受益于缓存。我想缩小范围,以便只有两种变体:缓存版本适用于“变体”是他们拥有对于具有 cookies 的用户(例如,用户已登录并且具有身份验证 cookies),还提供非缓存版本。

如果我将“Vary: Cookie”添加到我的 Perl 程序中,是否有办法告诉 NGINX,在这种情况下它只应关注 cookie 是否sessionId存在?类似于 -- 创建伪标头 -- 的方法Vary: Cookie('sessionId')?如果有办法在脚本生成的标头中实现这一点,并且 NGINX 会尊重这一点,那么我认为我更喜欢这样做,而不是将其放在 NGINX 配置中,但任何解决方案都会受到赞赏。

我不完全确定如何测试我是否会导致 NGINX 因缓存而发疯,但我想知道是否可以按照以下思路工作:对于未登录的查看者,脚本发送Vary: Cookie,但对于登录后,它会同时发送该标头和Cache-Control: no-cache。NGINX 会理解这是告诉它缓存第一个响应而不是变体吗?或者我会以我现在没有注意到的方式弄乱一些东西?

更新:这是我的一个服务器块的示例:

server {
    server_name myservername.tld
    listen 80;

    location / {
        proxy_cache $PROXY_CACHE;

        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout http_429 http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 1;
        proxy_cache_lock on;

        proxy_pass $scheme://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT;
    }

}

答案1

您应该看看指令proxy_no_cacheproxy_cache_bypass

proxy_no_cache告诉 nginx 在什么情况下不应缓存来自您应用的响应。您可以将其定义为您想要的任何内容,例如:

proxy_no_cache $cookie_sessionid;

proxy_cache_bypass以另一个方向运行:它告诉 nginx 什么时候不应该从缓存中提供请求,而是将其传递给您的应用程序,即使存在缓存条目。

相关内容