CloudFront Functions添加X-Frame-Options头仅根路径生效问题排查
问题原因
你编写的CloudFront函数逻辑本身没有问题,未在错误响应路径生效的核心原因是:
绑定到Viewer Response事件的函数,默认不会作用于CloudFront自定义错误页重写后的响应。当你访问/login这类S3中不存在的路径时,S3会先返回403/404状态码,CloudFront匹配到你配置的自定义错误规则,将响应重写为200状态码并返回index.html内容,这个重写后的响应流不会触发你绑定的普通Viewer Response函数,因此X-Frame-Options头没有被追加。
解决方案
方案1:调整CloudFront函数绑定规则(无需修改现有函数代码)
- 保留当前函数的
Viewer Response事件绑定 - 额外给同一个函数绑定
Origin Response事件 - 配置函数的触发条件为匹配所有请求路径,允许作用于所有状态码的响应。配置完成后,无论是正常访问路径返回的200响应,还是自定义错误页重写后的响应,都会触发函数追加响应头。
方案2:使用CloudFront托管响应头策略(无需自定义函数,稳定性更高)
- 进入CloudFront分发的行为配置页,编辑默认行为
- 在「响应头策略」配置项,选择自定义策略或者直接使用AWS托管的安全头策略:
- 若选择自定义策略,手动添加
X-Frame-Options头,值设置为DENY - 若选择托管策略,直接选用
Managed-SecurityHeadersPolicy,该策略会自动添加包括X-Frame-Options在内的所有常用安全响应头
- 若选择自定义策略,手动添加
- 保存配置并关联到默认行为后,该策略会自动作用于所有响应,包括自定义错误页重写后的响应。
验证配置
所有配置修改完成后,提交CloudFront分发变更,等待部署完成后执行缓存失效,再通过curl -I <你的站点地址>测试所有路径的响应,确认都携带x-frame-options: DENY头即可。
内容的提问来源于stack exchange,提问作者ischenkodv
相关产品推荐
相关产品推荐

