

# 控制 CloudFront 缓存错误的时间长度
<a name="custom-error-pages-expiration"></a>

CloudFront 缓存错误响应的默认持续时间为 10 秒。CloudFront 然后将对象的下一个请求提交给您的源，以查看导致错误的问题是否已解决，并且请求的对象是否可用。

您可以为 CloudFront 缓存的各 4xx 和 5xx 状态代码指定错误缓存时长（**错误缓存最小 TTL**）。（有关更多信息，请参阅 [CloudFront 缓存的 HTTP 4xx 和 5xx 状态代码](HTTPStatusCodes.md#HTTPStatusCodes-cached-errors)。） 指定持续时间时，注意以下几点：
+ 如果您指定一个很短的错误缓存时长，则与指定较长的时长相比，CloudFront 将向您的源转发更多请求。对于 5xx 错误，这可能会加重原先导致源返回错误的问题。
+ 当源针对某个对象返回错误时，CloudFront 会通过错误响应或自定义错误页面响应对象请求，直到超过错误缓存时间长度。如果您指定一个很长的错误缓存持续时间，CloudFront 可能会在对象再次转为可用后的很长一段时间内继续使用错误响应或您的自定义错误页面来响应请求。

**注意**  
您可以为 HTTP 状态代码 416（无法满足请求的范围）创建自定义错误页面，并可以更改源向 CloudFront 返回状态代码 416 时 CloudFront 向查看器返回的 HTTP 状态代码。（有关更多信息，请参阅 [更改 CloudFront 返回的响应代码](custom-error-pages-response-code.md)。） 但是，CloudFront 不缓存状态代码 416 响应，因此，即使您为状态代码 416 指定**错误缓存最小 TTL** 的值，CloudFront 也不会使用它。

如果您要控制 CloudFront 为各个对象缓存错误的时间长度，可以配置源服务器以为该对象的错误响应添加相应标头。

如果源添加 `Cache-Control: max-age` 或 `Cache-Control: s-maxage` 指令或 `Expires` 标头，则 CloudFront 缓存错误响应的时间为标头中的值或**错误缓存最小 TTL** 值（以较大的值为准）。

**注意**  
`Cache-Control: max-age` 和 `Cache-Control: s-maxage` 值不能大于为提取错误页面的缓存行为设置的**最大 TTL** 值。

如果源为错误代码 404、410、414 或 501 添加了 `Cache-Control: no-store`、`Cache-Control: no-cache` 或 `Cache-Control: private` 指令，则 CloudFront 不会缓存错误响应。对于所有其他错误代码，CloudFront 会忽略 `no-store`、`no-cache` 和 `private` 指令，并根据**错误缓存最小 TTL** 的值缓存错误响应。

如果源添加其他 `Cache-Control` 指令或不添加标头，则 CloudFront 缓存错误响应的时间等于**错误缓存最小 TTL** 的值。

如果某一对象的 4xx 或 5xx 状态代码的过期时间超过您希望等待的时间且对象再次可访问，您可以使用所请求对象的 URL 使缓存错误代码失效。如果源返回针对多个对象的错误响应，您需要分别使各个对象失效。有关使对象失效的更多信息，请参阅 [使文件失效以删除内容](Invalidation.md)。

如果您为 S3 存储桶源启用了缓存，并且在 CloudFront 分配中，将错误缓存最小 TTL 配置为 0 秒，则对于 S3 源错误，您仍会看到 1 秒的错误缓存最小 TTL。CloudFront 这样做是为了保护您的源免于 DDoS 攻击。这不适用于其他类型的源。