sys*_*out 5 caching http http-caching http-headers max-age
max-age在阅读Http Cache rfc后,我对行为有疑问.
场景:
用户代理
GET /foo
Run Code Online (Sandbox Code Playgroud)
Origin Server Response标头
cache-control: max-age=120
Run Code Online (Sandbox Code Playgroud)
服务器告诉用户代理在2分钟后应该重新验证所请求的资源.
1分钟后,用户代理发出另一个请求,指定max-age1分钟:
用户代理
cache-control: max-age=60
GET /foo
Run Code Online (Sandbox Code Playgroud)
据我所知,此请求应绕过用户代理缓存.
为什么?
虽然Origin Server告诉客户端资源应缓存2分钟,但用户代理需要一个最多1分钟的资源(max-age = 60).
从第一个开始经过1分钟和几秒钟后GET,该资源无效(从用户代理的角度来看),请求应直接进入原始服务器(或任何其他缓存层).
我对吗?是否可以从用户代理指定max-age大于零?它是否受到常见浏览器的支持/尊重?
在我工作的地方,我们有一个.NET自定义缓存机制,就像这样工作; 客户端可以指定max-age何时需要来自缓存的资源,该资源是"AT MOST"X秒.
没有必要怀疑.
RFC7234第5.2.1.1节包含一个max-age=5当然大于零的示例.定义也很明确(强调我的):
"max-age"请求指令表示客户端不愿意接受年龄大于指定秒数的响应.
"指定的秒数"可以是任何非负整数(在1.2.1节中定义).所以答案肯定是肯定的.
另外,我上面引用的定义也解释了场景中的缓存行为.但在我开始之前,我应该纠正以下问题:
服务器告诉用户代理在2分钟后应该重新验证所请求的资源.
不正确.
该max-age=120指令意味着服务器告诉所有缓存,而不是用户代理,必须在2分钟后将响应视为过时.从第5.2.2.8节(强调我的):
"max-age"响应指令表示响应在其年龄大于指定的秒数后被视为过时.
如您所见,没有重新验证要求.如果在10分钟之后没有对同一资源的请求,则在10分钟后才会进行任何重新验证.
另外,从第5.2节(强调我的):
"Cache-Control"头字段用于指定请求/响应链中的高速缓存的指令.
只是缓存,而不是用户代理.
请求/响应链中的每个参与者使用相同的Cache-Control标头接收相同的响应,但Cache-Control标头的预期接收者只是高速缓存.请记住,仅仅因为你收到它,并不意味着它适合你.
对于您的其他方案,您的评估是正确的.我在这里引用它:
1分钟后,用户代理发出另一个请求,指定
max-age1分钟:...
据我所知,此请求应绕过用户代理缓存.为什么?
因为在请求时,存储的响应的年龄超过60秒.显而易见的是,如果存储的响应的年龄是例如65秒,则它不能用于满足具有max-age=60指令的请求.因此,缓存只是服从它收到的指令.
事实上,任何符合标准的HTTP缓存无论是集成在浏览器中还是单独的都需要遵守它收到的指令,如第5.2节所述(来自源代码的大写重点,而不是我的):
高速缓存必须遵守本节中定义的Cache-Control指令的要求.
根据您的描述,您在工作中使用的自定义缓存机制似乎符合标准.所以,我对开发人员的补充,特别是如果用"自定义"你的意思是"内部开发".
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |