因为源服务器不总是提供明确的过期时间,缓存可以在没有指定明确时间的时候分配一个启发式过期时间,采用的逻辑是使用其他头字段(如Last-Modified时间)来估计一个近似的过期时间。本规范没有提供具体的逻辑,但是对结果施加了最坏情况的限制。

    当一个明确的过期时间出现在已存储的响应中时,缓存不得使用启发式来确定新鲜度。因为第3节的要求,这也意味着,启发式只可以被用在没有明确新鲜度且状态码被定义为默认可缓存的(查看RFC7231,6.1节)响应,以及没有明确新鲜度和明确被标记为可缓存的响应(例如,带有一个“public”的响应指令)。

    如果响应有一个Last-Modified头字段(RFC7232,2.2节)缓存被鼓励使用启发式过期时间值,这个时间值不超过自那个时间依赖的一小部分比例的时间间隔。一个典型的比例设置是10%。

    当启发式被用于计算新鲜度生命周期时,缓存应该在响应中生成带113警告状态码(查看5.5.4节)的Warning头字段,如果它的当前年龄超过24小时并且这个警告还没有出现。

    注意:RFC2621,13.9节禁止为带有查询组件的URI(即,包含“?”的URI)计算启发式新鲜度。实践中,这并没有被广泛实现。因此,源服务器被鼓励如果他们希望排除缓存,应该发送明确的指令(例如,Cache-Control:no-cache)。