我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_cache
和proxy_cache_bypass
。
proxy_no_cache
告诉 nginx 在什么情况下不应缓存来自您应用的响应。您可以将其定义为您想要的任何内容,例如:
proxy_no_cache $cookie_sessionid;
proxy_cache_bypass
以另一个方向运行:它告诉 nginx 什么时候不应该从缓存中提供请求,而是将其传递给您的应用程序,即使存在缓存条目。