据我所知,某些HTTP状态代码默认是可缓存的。来自RFC 7231:
响应默认情况下定义为可缓存的状态代码 (例如,200,203,204,206,300,301,404,405,410,414和501 in 具有启发式过期的缓存可以重用此规范) 除非方法定义或显式缓存另有说明 控件[RFC7234];所有其他状态代码都不可缓存 默认值。
为什么 HTTP状态码451默认可缓存?来自RFC 7725:
3. 451 Unavailable For Legal Reasons
...默认情况下,451响应是可缓存的,除非另有说明 由方法定义或显式缓存控件指示...
451 is a new HTTP status code用于表示由于法律原因而无法使用的资源,例如例如版权问题。 GitHub将其用于DMCA notice'd repositories。
昨天合法不可用的资源可能会在今天发布。我明白缓存是短期的,因此404可缓存是有道理的,但我认为,当涉及到法律审查时,当前性至关重要。为什么这个状态代码应该可缓存默认情况下?当响应者认为资源将暂时被阻止时,响应可以指定何时需要缓存状态代码。
答案 0 :(得分:2)
你提到的RFC 7234的第二部分(4.2.3)与响应代码无关,它只讨论请求方法 - 它区分GET,HEAD和理论上POST与其他方法如DELETE,PUT等因此,它与RFC 7725的作者为什么将响应代码451定义为可缓存无关。
更相关的比较是6.1节中提到的其他状态代码,其中包括206(由代理修改),301(重定向),404(未找到)以及许多其他代码。这里的可缓存性并不意味着将来状态永远不会改变;相反,它意味着状态在短期内不太可能发生变化,因此短时间内两个相同的请求将产生相同的响应,并且可以安全地跳过。相比之下,默认情况下,状态201(已创建)未标记为可缓存,因为第二个相同的请求将具有不同的结果(创建第二个副本)或不同的响应(例如,返回状态为200的现有资源)。
状态451是可缓存的,因为30秒后重试不太可能泄露资源。稍后重试30 天可能会有不同的结果,但可以通过到期和缓存控制标头以及缓存实现中的合理默认值来指示。
404是一个特别好的比较,因为在许多情况下这是451的合理替代品 - 资源不可用,并且可能无法使其可用。但是默认情况下404是可缓存的,因为重复请求丢失的页面不会突然出现,因此缓存可以有效地跳过请求,直到达到通信的生命周期。