nginx 1.8.1 未使用 Vary Accept 标头进行缓存

nginx 1.8.1 未使用 Vary Accept 标头进行缓存

我遇到了奇怪的 nginx 缓存行为。有 2 个响应。第一个在我将服务器从 1.6 更新到 1.8.1 时停止了缓存,另一个像以前一样缓存。第一个(损坏)有以下响应标头:

允许→GET、HEAD、OPTIONS

连接→保持活动

内容编码 →gzip

内容语言 →ru

内容类型 →application/json

日期 →2016 年 3 月 15 日星期二 07:31:53 GMT

服务器 →nginx/1.8.1

传输编码→分块

變化 →接受、接受语言、Cookie、接受编码

X-Frame 选项 →SAMEORIGIN

另一个响应(按我预期的方式工作)具有以下标题:

连接→保持活动

内容编码 →gzip

内容语言 →ru

内容类型 →application/json

日期 →2016 年 3 月 15 日星期二 07:32:40 GMT

服务器 →nginx/1.8.1

传输编码→分块

變化 →接受语言、Cookie、接受编码

X-Frame 选项 →SAMEORIGIN

第一种情况下没有 cookies 或 Accept 标头,但只有

proxy_ignore_headers Vary

挽救了局面。它与之配合得很好。看起来像是某种魔法。但哪里出了问题,我遗漏了什么?以下是当前设置:

proxy_pass    http://localhost:7050;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
limit_req zone=banka burst=5 nodelay;
proxy_cache   cache;
proxy_cache_valid 5m;
proxy_ignore_headers Vary;
    

答案1

不知道您是否已修复它,我会将其放在这里以防有人需要它。

在 Nginx 的源代码中,Vary 标头的最大长度为 42 个字符。在我的例子中,Vary 标头的最大长度为 51 个字符,因此我的 Vary 标头被处理为 Vary:* (no-cache)。将最大值设置为 84 可以解决这个问题。

本文对此进行了更深入的解释。

https://thedotproduct.org/nginx-vary-header-handling/

感谢发表该短文的人。

相关内容