从 Squid 代理获取“响应已过时”

从 Squid 代理获取“响应已过时”

我正在查看 Chrome 开发工具中的日志。我也可以使用 curl 查看它。以下是 curl 的输出

Content-Type: application/javascript
Date: Sat, 24 Sep 2016 01:16:37 GMT
ETag: "a02d00a09b8139b0919567e4c92cc752"
Last-Modified: Fri, 23 Sep 2016 22:57:56 GMT
Server: nginx
x-amz-id-2: L3gfIQNLcBLUZ2gtVWDiIdN9xWWiV2H6K6zjjE9JSHVMnDXI6+uLuhqptqQRCZLNFoMmWg3mIQs=
x-amz-request-id: E38062B3D506DF06
Content-Length: 1940494
Age: 7574
Warning: 110 squid/3.5.20 "Response is stale"
X-Cache: HIT from 0.0.0.0
X-Cache-Lookup: HIT from 0.0.0.0:3128
Via: 1.1 0.0.0.0 (squid/3.5.20)
Connection: keep-alive

鱿鱼为什么这么说Warning: 110 squid/3.5.20 "Response is stale"

答案1

Squid 添加此标头是因为 HTTP 缓存规范要求这样做。https://www.rfc-editor.org/rfc/rfc7234#section-5.5.0

“警告”标头字段用于携带有关消息状态或转换的附加信息,这些信息可能不会反映在状态代码中。此信息通常用于警告缓存操作或应用于消息有效负载的转换可能引入的不正确性。

而第 5.5.1 节只是简单地指出,当 HIT 对象过期时,缓存必须(应该)发送 110 警告。“应该”RFC 要求是必须遵循的,除非存在特定、非常好且有据可查的理由。警告是有用的,因此没有理由避免它们。

过时的内容不仅仅是旧的,而且还超过了缓存应该询问服务器是否有更新副本(重新验证)的点。因此,警告是说,如果你真的更新服务器副本后,缓存仍会提供旧版本。这可能会严重破坏 HTTP 应用程序的行为,尤其是涉及 .js 时。

这种情况通常是由于管理员配置了一些违反 HTTP 重新验证要求的 refresh_pattern 设置所致。例如,ignore-* 选项强制从缓存中按原样提供对象,而不是重新验证。

由于此响应没有 Cache-Control 标头,因此 Squid 使用 refresh_pattern min/pct/max 值来计算过期时间。您可能要考虑增加这些值,以延长对象的正常 HIT 寿命,而不是忽略/违反 HTTP 要求。

相关内容