我知道Vary: Cookie
它不太受欢迎,因为它会导致缓存用户可能报告的每个 cookie 变体。另一方面,如果没有它,我不得不Cache-Control: no-cache
告诉我的 NGINX 缓存服务器完全跳过可能有用户登录的缓存内容(顺便说一下,我网站的每个页面,因为顶部有一个帐户框这页纸)。
我只在用户登录时发送 cookie,因此大多数页面视图都会从缓存中受益。我想缩小范围,以便只有两种变体:“差异”是没有cookie 的用户的缓存版本和有 cookie 的用户的非缓存版本(例如,用户已登录并拥有身份验证 cookie)。
如果我在我的 Perl 程序中添加“Vary: Cookie”,有没有办法告诉 NGINX 在这种情况下它应该只关注sessionId
cookie 是否存在?类似于 - 制作伪标题 - 的东西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;
}
}
您应该查看指令
proxy_no_cache
和proxy_cache_bypass
.proxy_no_cache
告诉 nginx 在什么条件下它不应该缓存来自您的应用程序的响应。您可以将其定义为您想要的任何内容,例如:proxy_cache_bypass
在另一个方向上运行:它告诉 nginx 何时不应从缓存中提供请求,而是将其传递给您的应用程序,即使存在缓存条目也是如此。