HTTP 请求头的 Cache-Control: no-cache 可以强制让代理服务器回源吗?

2022-05-07 23:13:32 +08:00
 fstar

我浏览器一个强制刷新就是一个 Cache-Control: no-cache (请给我最新资源)。 但作为一个 CDN 代理服务器,你老是回源不太好吧。

一般中间代理服务器对于这种情况,底层到底怎么做的,有人知道吗?

1934 次点击
所在节点    程序员
7 条回复
lslqtz
2022-05-08 00:12:05 +08:00
特定间隔忽略 no-cache 吧,全程忽略客户端的应该也有。
ZE3kr
2022-05-08 00:13:04 +08:00
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control

当然是用 s-maxage=<seconds>啦:

> 覆盖 max-age 或者 Expires 头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它。
toneytonight
2022-05-08 08:32:35 +08:00
静态资源的话,CDN 一般默认会忽略这种请求头的,除非在 CDN 规则中特殊配置。
ojh
2022-05-08 10:09:08 +08:00
The no-cache request directive asks caches to validate the response with the origin server before reuse.

Cache-Control: no-cache 请求头就是告诉 CDN 去回源校验新鲜度,你说老是回源不太好是什么意思?这种方式既可以获取最新资源又省流量

然后底层就是遵循 HTTP 的缓存机制,你提到的这种回源就是利用 Cache-Control: no-cache 响应头 + 协商缓存通用头来实现校验新鲜度的

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
fstar
2022-05-08 10:40:18 +08:00
@ojh

就是有一个源服务器,然后有一级代理服务器、二级代理服务器。这些代理服务器会不时去源服务器获取资源缓存下来。

用户访问资源时,DNS 查询通过负载均衡,给用户返回一个对于用户来说最快的 IP ,假设是一个二级代理服务器。这时候用户的请求头带上了 Cache-Control: no-cache ,希望获取最新资源。

因为对方是代理服务器,保存的是资源的副本,并不是最新资源。

所以我就好奇这个代理服务器会不会强制请求源服务器拿到最新资源。这个缓存服务器从源服务器更新资源的过程就是回源。
ragnaroks
2022-05-08 11:53:46 +08:00
边缘节点一般会无视此类控制头,因为有效的话就失去 CDN 的意义了
ojh
2022-05-08 13:18:40 +08:00
@fstar 如何按标准(正如我一开始 post 的 no-cache 定义),缓存代理服务器是会去回源校验新鲜度的。这只是标准,实际这些代理服务器会不会就不好说,因为有些代理服务器是不按标准来的或者说不支持把,比如 Nginx 就不知道部分功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX