在调试生产问题时,我们发现对网址的GET请求为一个用户返回500 Internal Server Error
,但为其他所有人返回200 OK
。看起来500是从缓存中提供的,但是自从重现这个bug以来的任何尝试都没有成功。
我的问题是:浏览器是否可以缓存错误响应?如果是这样,哪些浏览器支持它以及我需要复制它的缓存头?
我的直觉是错误响应不应该被缓存,因为即使已修复错误,您仍将继续被拒绝服务。基于Which HTTP status codes are cacheable?,似乎500根本不可缓存。是否在浏览器中一致地实施了缓存策略?
答案 0 :(得分:1)
500 Internal Server Error
被指定为默认情况下无法缓存。有关参考,请参阅Section 6.1 of RFC 7231和Section 6.6.1 500 Internal Server Error of RFC 7231。如果默认情况下500可以缓存,则规范将明确定义。
但是,根据显式缓存标头,可以覆盖此行为,并且完全可能发生缓存500响应,因为Section 3 of RFC 7234说明了问题的其他相关内容:
请注意,上面列出的任何要求都可以被缓存控制扩展名覆盖;
我的猜测是,在出现500错误的情况下,某些内容已被搞砸了。
要激发500响应的缓存,可以尝试在public
响应标头中设置Cache-Control
标记。