当响应代码是设置了自定义错误响应的错误时,CloudFront 是否会丢弃 Origin 响应 body?

Does CloudFront drop Origin response body when the response code is an error for which a Custom Error Response was set?

我首先要说的是,在我的情况下,答案似乎是 ,但是我可能错误配置了我的设置,并且在文档中的任何地方都找不到提及这一点, 所以我想知道它是如何工作的。

定义自定义错误响应时,您可以选择来自来源的错误代码、return 的响应页面以及替换来源中的错误代码。

通常这会按预期工作 - 例如,当 Origin 提供 403 时,我将 CloudFront 设置为 return "error.html",代码为 404。当探测 link 时,我知道应该 return 一个 403,我收到 "error.html" 和 404。 不幸的是,当 Origin 提供它自己的 body 时(我已经看到这种情况发生在 JSON 以及 HTML 页面上),CloudFront 只替换了 headers - 错误代码从 403 正确切换到 404,但 body 是由 Origin 发送的 - "error.html" 未提供。

这是预期的行为吗?文档是否在任何地方提到了这一点?

你所描述的不是预期的。

配置自定义错误页面和自定义响应代码应将 整个 响应替换为自定义响应 -- headers 和 body --以及自定义状态代码——包括原始响应 header 或 body 的 none

如果发生第二个错误——即 CloudFront 在实际获取自定义错误文档期间遇到的错误——代码和 body 都将是该过程中提供的来源第二个请求。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html

您可能会检查响应 header,尤其是 Age header,以确认您没有收到比预期更早的缓存响应。更改自定义错误页面配置不会使任何 already-cached 错误响应无效。

Cross-check CloudFront 记录原始日志以验证您所看到的内容确实存在。

另请注意,上述 none 适用于与 edge-optimized API 网关端点关联的 "hidden" CloudFront 分配的错误响应,也不适用 Lambda @Edge自定义错误响应。