Cache-Control 请求 headers 是否会影响 server-side 缓存?

Should Cache-Control request headers influence server-side caching?

关于RFC7234 和 Cache-Control header 代理的讨论我已经看到很多了,但是我不太清楚请求是否 headers 应该影响 server-side 缓存。

下图显示了我所关注的 headers 所在的位置(向下箭头是请求 headers,向上箭头是响应 headers):

      ┌────────┐
      │ Client │
      └────────┘
        ↓    ↑
      ┌────────┐
      │ Cache  │
      └────────┘
        ↓    ↑
      ┌────────┐
      │ Cache  │
      └────────┘
        ↓    ↑
      ┌────────┐
      │ Server │
      └────────┘
  ??? → ↓    ↑
    ┌─────────────┐
    │ Server-side │
    │    Cache    │
    └─────────────┘

关于 Cache-Control 和 server-side 缓存之间的交互,我有很多问题(例如 Cache-Control: no-cache 是否意味着服务器应该 re-validate 自己的缓存? ).但绝大多数归结为以下几点:

server-side 是否应该使用请求中的 Cache-Control 和其他关联的 header 来获取有关其 server-side 缓存的逻辑?

以下面的小(虽然粗糙)Python Flask应用为例:

@app.route('/app/<id>')
def endpoint(id):
    if 'no-store' not in request.headers['Cache-Control']:
        # If 'no-store' isn't specified, try cache first
        entry = entry_cache.get(id)
        if entry is None:
            entry = service.get_entry(id)
    else:
        # Otherwise, immediately talk to the service
        entry = service.get_entry(id)
    return entry

此外,这引发了另一个问题,根据答案,上述问题可能会变得无关紧要:

server-side应该做什么样的缓存?什么情况下我们应该依赖 HTTP 缓存并计算每个请求的响应(除了 If-None-Match 等情况)?

就上下文而言,我倾向于开发的大多数应用程序都被设计为 micro-services 作为容器或无服务器功能,缓存往往是对外部服务的调用,例如 Redis。没有多少浏览器调用这些 HTTP 端点;大多数客户端是业务应用程序。

更新(2021-08-17):感谢凯文的反馈!我已经更新了图表和一些措辞以澄清我特指请求缓存 headers 而不是响应 headers。此外,我添加了一个非常小的(非常 粗糙)Python Flask 应用程序来帮助说明我所指的逻辑类型。

HTTP 缓存规范未绑定到服务器的内部缓存行为。根据定义,服务器的响应是最新的,无论它是如何生成的。因此,虽然中间代理使用 no-cache 指令为请求提供缓存响应会违反协议,但服务器本身却不会。

也就是说,协调两种缓存当然是可能的,无论是隐式(响应碰巧设置了缓存请求 headers 的请求)还是显式(定义要使用的 API内部行为的 HTTP 缓存 headers)。所以你的 Flask 例子对我来说很有意义。也就是说,我不熟悉在缓存代理之外使用这些请求 headers 的站点或框架,因此您可能是这方面的开拓者。