浏览器可以缓存 500 Internal Server Error 响应吗?

Can a 500 Internal Server Error response be cached by a browser?

在调试生产问题时,我们发现对 URL 的 GET 请求为一个用户返回 500 Internal Server Error,但为其他所有人返回 200 OK。看起来 500 是从缓存中提供服务的,但是此后重现此错误的任何尝试都没有成功。

我的问题是:错误响应是否可以被浏览器缓存?如果是这样,哪些浏览器支持它以及我需要复制什么缓存 headers?

我的直觉是不应缓存错误响应,因为即使错误已修复,您仍将继续被拒绝服务。基于 ,似乎 500 根本不应该被缓存。缓存策略是否在浏览器中一致实施?

A 500 Internal Server Error 被指定为 默认情况下不可缓存 。有关参考,请参阅 Section 6.1 of RFC 7231 and Section 6.6.1 500 Internal Server Error of RFC 7231。如果默认情况下 500 是可缓存的,规范将对其进行明确定义。

但是,根据显式缓存 headers,此行为可以被覆盖,并且完全可能发生 500 响应被缓存,因为 Section 3 of RFC 7234 说,除其他与您的问题相关的事情外,这个:

Note that any of the requirements listed above can be overridden by a cache-control extension;

我的猜测是,在出现 500 错误的情况下,缓存 header 出现了问题。

要激发 500 响应的缓存,可以尝试在 Cache-Control 响应中设置 public 标志 header。