火山引擎 CDN + 对象存储 TOS 场景下跨域(CORS)配置的最佳实践

CORS 介绍

CORS(Cross-Origin Resource Sharing)是一种跨域访问技术,用于解决跨域请求的问题。在发送跨域请求前,用户浏览器会先发送一个预检请求。预检请求使用 OPTIONS 方法,包含 Origin 请求头用于指示请求的来源。

服务器收到预检请求后,根据服务器上的跨域配置:

  • 如果 Origin 的值不在服务器上的 Access-Control-Allow-Origin 列表中,服务器响应 403 状态码,表示不允许来自该 Origin 的请求。
  • 如果 Origin 的值在 Access-Control-Allow-Origin 列表中,服务器在预检请求的响应中至少会包含 Access-Control-Allow-OriginAccess-Control-Allow-Methods 头部。Access-Control-Allow-Origin 告知浏览器哪些请求来源是合法的。Access-Control-Allow-Methods 告知浏览器在发送跨域请求时可以使用的方法。之后,浏览器发送跨域请求。

备注:本文不对 CORS 原理做详细描述。上述介绍仅服务于本文主题。

CDN + TOS 的跨域场景

在火山引擎内容分发网络(CDN)中,您可以设置源站为火山引擎对象存储(TOS)中的一个存储桶,对存储桶中的文件进行传输加速。在 CDN 缓存来自存储桶的文件时,该文件的响应头会随文件一起被缓存。

在 CDN + TOS 的场景中,跨域配置有以下几种方式。但是每种方式下都可能会出现跨域问题。

方式一:仅在存储桶设置跨域配置

在该方式下,如果您修改了存储桶的某个跨域配置,该配置可能无法生效,原因如下:

  • 配置修改后,CDN 中已缓存文件的源站响应头不会更新。对于这些文件的请求,CDN 响应中包含的依然是更新前的跨域配置。

方式二:仅在 CDN 中设置跨域配置

在该方式下,如果存在预检请求,用户的跨域请求可能会失败,原因如下:

  • 因为 CDN 不会缓存预检请求的结果,CDN 会将收到的预检请求转发到 TOS。由于存储桶没有跨域配置,导致 TOS 响应 403 状态码。接着,CDN 将该 403 状态码返回给用户。

方式三:在存储桶和 CDN 中设置相同的跨域配置

在该方式下,如果您修改了存储桶或者 CDN 中的某个跨域配置,但是没有在两边及时同步,那么跨域请求的结果可能会不符合预期。

CDN + TOS 的推荐跨域配置

要避免这些跨域问题,我们推荐您两种配置。

推荐配置一

该配置实施方便,但存在配置冗余。在该配置下,您需要完成以下步骤:

  • 在存储桶和 CDN 中都设置相同的跨域配置。
  • 任何的跨域配置更新都及时在存储桶和 CDN 同步。

推荐配置二

该配置有点复杂,但没有冗余,可以帮助您理解配置原理。在该配置下,您需要完成以下步骤:

  • 在存储桶中,仅设置 来源 Origin操作 Methods
  • 在 CDN 中,设置所有的跨域配置。
  • 如果 Access-Control-Allow-OriginAccess-Control-Allow-Methods 的配置需要更新,您需要确保 CDN 和存储桶中的配置保持同步。
  • 其余跨域配置仅需在 CDN 中维护更新。

备注:

  • 在存储桶中设置 来源 Origin操作 Methods 的目的是为了 TOS 能正确响应预检请求。
  • 在 CDN 的响应中,CDN 中的跨域配置会覆盖存储桶中的跨域配置。

Access-Control-Allow-Origin 列表包含多个域名或者泛域名时的额外配置

如果您配置的 Access-Control-Allow-Origin 列表包含多个域名或者泛域名,您需要额外完成以下步骤。

  • 在 CDN 中设置 HTTP 响应头 Vary: Origin。该配置的说明如下:
    • 如果该配置未开启,假设一个跨域请求的文件已在本地缓存中,但是该缓存文件的 Origin 与该跨域请求的 Origin 不同,那么结果可能会不符合预期。因为在这个情况下,即使该跨域请求的 Origin 在您配置的 Access-Control-Allow-Origin 列表中,也会因为与缓存文件的 Origin 不匹配而导致跨域请求失败。
      在这里插入图片描述
    • 该配置开启后,不同 Origin 但是 URL 相同的跨域请求会被客户端认为是不同的请求而发送给 CDN。同时,客户端也会在本地缓存中为每个 Origin 的请求创建各自的文件副本。这样,跨域请求的结果可以符合预期。
      在这里插入图片描述
  • 在 CDN 中设置 跨域校验开启。关于该配置的说明,参见 配置 HTTP 响应头

备注

  • 不建议您在存储桶设置 返回 Vary:Origin开启。虽然不会造成请求结果不符合预期,但是对于一个用户请求(包括跨域请求和非跨域请求),只要请求的文件不在本地缓存,该请求就会触发 CDN 向源站请求该文件或者做回源校验。这会导致回源请求数增加。
  • 如果您配置 Access-Control-Allow-Origin*,则无需设置 HTTP 响应头Vary: Origin。同时,跨域校验 可以保持为 关闭

操作示例

假设您希望在 CDN + TOS 场景下设置以下跨域配置:

  • Access-Control-Allow-Origin:https://*.example.com,https://www.test.com
  • Access-Control-Allow-Methods:GET,POST
  • 预检请求结果的有效期:1小时

如果您使用推荐配置二,在存储桶和 CDN 中的配置如下。

存储桶配置

在存储桶中,设置以下跨域配置:
在这里插入图片描述

CDN 配置

在 CDN 的 “HTTP 响应头” 配置中,设置以下头部。
在这里插入图片描述

更多信息

如果您的源站是其他云厂商的对象存储桶,或者您的源站本身就有跨域配置,也可以参考本文档的思路进行相应设置。

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CDN(内容分发网络)是一种将内容分发到全球各个节点的网络架构,可以提高用户访问网站的速度和性能。CDN通过缓存网站的静态资源并将其分布到离用户最近的服务器上,从而减少了传输延迟。 DDoS(分布式拒绝服务攻击)是一种网络攻击方式,旨在通过向目标服务器发送大量的请求来使其超负荷运行,导致服务不可用。DDoS高防服务是一种专门用于保护目标服务器免受DDoS攻击的服务。它使用各种技术和策略来检测和过滤恶意流量,确保正常的合法流量能够到达目标服务器。 WAF(Web应用程序防火墙)是一种用于保护Web应用程序安全的安全设备或服务。WAF可以检测和阻止针对Web应用程序的各种攻击,例如SQL注入、跨站脚本等。它通过检查应用程序的请求和响应,筛选和过滤恶意的或异常的请求,从而保护Web应用程序免受攻击。 SLB(负载均衡)是一种将网络流量分布到多个服务器的技术,以提高系统的性能和可靠性。负载均衡器可以根据服务器的负载情况,动态地将请求分发给最合适的服务器,从而避免某个服务器过载而导致服务不可用。 最佳部署架构是将客户端流量先经过DDoS高防服务,然后通过CDN进行加速分发,接着通过WAF进行安全防护,并最后通过负载均衡器将流量转发到源站服务器。这样的架构可以同时保障网络安全和性能。 当WAF与DDoS高防或CDN一起接入时,只需将WAF提供的CNAME地址配置为DDoS高防或CDN的源站即可。这样流量会先经过DDoS高防或CDN,然后被转发到WAF进行安全防护,最后再转发至源站。这种配置可以实现对源站的全面安全防护。 关于CDN P2P服务和直播相关的内容,可能需要更多的细节才能提供具体的回答。请提供更多的信息,以便我可以更好地回答您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值