配置跨域资源共享

更新时间:
复制为 MD 格式

当您的业务接入阿里云DCDN后,需要跨域共享或者访问资源时,您可以通过配置自定义HTTP响应头来实现跨域访问。

什么是跨域资源共享

跨域资源共享CORS(Cross-Origin Resource Sharing)简称跨域访问,是HTML5提供的标准跨域解决方案,允许网页从不同源加载和访问跨域资源,从而实现安全的跨域数据传输。更多信息可以参考跨域资源共享

说明

Q:CDN 默认不开启跨域会有什么效果?

CDN 默认不开启跨域资源共享(CORS)。若未配置,浏览器因同源策略会拦截跨域请求,即不允许其他网站引用该资源。

为什么要配置跨域资源共享

由于安全限制,浏览器通常会遵循同源策略,限制从不同域、子域、协议或端口加载和访问资源的请求。例如,example.com无法访问example.org上的资源。通过配置跨域资源共享,可以在DCDN服务器端设置相关的响应头。如果请求携带了满足允许规则的请求头,则返回对应的HTTP响应头部,从而实现跨域资源的加载和访问。

数据交互示意图

未开启跨域共享

image

开启跨域共享后

image

注意事项

  • 若使用OSS作为源站,DCDN控制台配置的CORS将覆盖OSS的配置。OSS相关的跨域配置,请参见跨域设置

  • DCDN控制台配置的HTTP响应头(如Access-Control-Allow-OriginCORS头)对所有资源类型均生效,包括动态API请求。

开启跨域资源共享

  1. 登录DCDN控制台

  2. 在左侧导航栏,单击域名管理

  3. 域名管理页面,单击目标域名对应的配置

  4. 在指定域名的左侧导航栏,单击缓存配置

  5. 选择修改出站响应头页签,单击添加,配置节点HTTP响应头。

  6. 请参考以下内容进行选择,设置允许的跨域请求的来源,然后单击确定保存配置。

    image

    参数

    说明

    示例

    响应头操作

    需要设置为增加才能使用跨域验证功能。

    增加

    自定义响应头参数

    需要设置为Access-Control-Allow-Origin才能使用跨域验证功能。

    Access-Control-Allow-Origin

    响应头值

    关闭跨域验证:仅支持设置通配符或者单个指定源。

    • 通配符 *:使用通配符表示允许任何源访问资源。

    • 单个指定源:指定一个具体的源(域名),表示仅允许该特定源访问资源。

    开启跨域验证:支持设置通配符、单个指定源、多个指定源、泛域名源。

    • 通配符 *:使用通配符表示允许任何源访问资源。

    • 单个指定源:指定一个具体的源(域名),表示仅允许该特定源访问资源。

    • 多个指定源:配置多个具体的源(域名),相互间使用半角逗号,隔开,表示允许该范围内的源访问资源。

    • 泛域名源:可以配置一个泛域名,表示允许与该泛域名匹配的所有源访问资源。

    • *

    • http://www.aliyun.com

    • https://aliyun.com,http://www.aliyun.com

    • http://*.aliyun.com

    是否允许重复

    • 允许:即源站返回的头会保留,同时会加上一个同名的头。

    • 不允许:即源站返回的头会被新配置的同名头覆盖。

    重要

    是否允许重复跨域验证这两个配置项之间存在互斥,是否允许重复配置为允许的情况下,跨域验证将会失效。

    不允许

    跨域验证

    • 跨域验证只有在响应头操作增加自定义响应头参数为“Access-Control-Allow-Origin”的时候才可以配置。

    • 跨域验证取值为关闭开启,默认为关闭状态。

      • 关闭状态下CDN节点不会校验用户请求中携带的Origin头,只会固定响应已配置的“Access-Control-Allow-Origin”值。

      • 开启状态下CDN节点将按以下规则对用户做跨域校验,并根据校验结果响应“Access-Control-Allow-Origin”的值。跨域校验规则如下所示:

        • 任意匹配:自定义响应头参数“Access-Control-Allow-Origin”的值设置为“*”时,不论用户请求里面是否携带“Origin”参数,也不论携带的“Origin”参数为何值,都固定返回“Access-Control-Allow-Origin:*”。

        • 精确匹配:自定义响应头参数“Access-Control-Allow-Origin”的值设置了单个或者多个值(多个值之间用半角逗号“,”分隔)。

          • 如果用户请求头里携带的“Origin”参数值与被设置的任意一个值精确匹配,就会响应对应的跨域头。

          • 如果都没有精确匹配上,则不响应跨域头。

        • 泛域名匹配:自定义响应头参数“Access-Control-Allow-Origin”的值设置了泛域名,则会校验请求头中Origin值是否能匹配上“Access-Control-Allow-Origin”的泛域名。

      • 开启状态下,如果响应头值中的域名包含短划线-,需要对短划线做转义处理后再配置,将-转义为%-。例如:

        • 原始响应头值:http://doc.aliyun-example.com

        • 转义后的响应头值:http://doc.aliyun%-example.com

    开启

  7. 请参考以下内容进行选择,设置允许的跨域请求方法,然后单击确定保存配置。

    image

    参数

    说明

    示例

    响应头操作

    需要设置为增加

    增加

    自定义响应头参数

    需要设置为Access-Control-Allow-Methods

    Access-Control-Allow-Methods

    响应头值

    支持GET、POST、PUT这些请求方法。如果您需要同时添加GET、POST、PUT,请使用半角逗号,隔开。

    GET

    是否允许重复

    • 允许:即源站返回的头会保留,同时会加上一个同名的头。

    • 不允许:即源站返回的头会被新配置的同名头覆盖。

    不允许

配置示例

示例一

如果跨域资源共享的响应头值设置了单个或者多个值(多个值之间用“,”分隔):

  • 用户请求头中的“Origin”参数值与任意一个设置值精确匹配时,DCDN节点响应对应的跨域头。

  • 如果都没有精确匹配上,则不响应跨域头。

DCDN上设置:Access-Control-Allow-Origin:http://example.com,https://aliyundoc.com

  • 用户请求携带的Origin头是http://example.comDCDN节点响应Access-Control-Allow-Origin:http://example.com

  • 用户请求携带的Origin头是https://aliyundoc.comDCDN节点响应Access-Control-Allow-Origin:https://aliyundoc.com

  • 用户请求携带的Origin头是http://aliyundoc.comDCDN节点将不会响应(协议头不匹配,用户请求的是HTTP协议,DCDN上设置的是HTTPS协议)。

  • 用户请求携带的Origin头是http://aliyun.comDCDN节点将不会响应(域名不匹配)。

示例二

如果跨域资源共享的响应头值设置了泛域名,则会校验请求头中Origin值是否能匹配上Access-Control-Allow-Origin的泛域名。

DCDN上设置:Access-Control-Allow-Origin:http://*.aliyundoc.com

  • 用户请求携带的Origin头是http://demo.aliyundoc.comDCDN节点响应Access-Control-Allow-Origin:http://demo.aliyundoc.com

  • 用户请求携带的Origin头是http://demo.example.comDCDN节点不会响应(域名不匹配)。

  • 用户请求携带的Origin头是https://demo.aliyundoc.comDCDN节点不会响应(协议头不匹配,用户请求的是HTTPS协议,DCDN上设置的是HTTP协议)。

说明

Q:如何使用 curl 验证 CDN 响应头中的 Access-Control-Allow-Origin 是否生效?

使用 curl -svo /dev/null 发送带 Origin 请求头的 GET 请求,通过详细输出检查响应头。若响应头中存在 Access-Control-Allow-Origin 字段且值符合预期(如 * 或指定域名),则说明 CDN 跨域配置已生效;若缺失,需检查 CDN 控制台自定义响应头配置或源站设置。

curl -svo /dev/null https://img.anleme.cc/agent/dl1.jpg -H 'origin:https://am.anleme.cc'