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

什么是跨域资源共享

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

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

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

数据交互示意图

未开启跨域共享

image

开启跨域共享后

image

注意事项

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

  • 若使用本地服务器或ECS实例作为源站,建议动静分离,静态文件使用 CDN 加速。 CDN 控制台配置的CORS功能仅对静态文件生效。

开启跨域资源共享

  1. 登录 CDN控制台

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

  3. 在域名列表中选择目标域名,单击 操作 列的 管理

  4. 单击 缓存配置 ,选择 修改出站响应头 页签,设置指定允许的跨域请求的来源和请求方法。

    • 设置跨域请求来源

      单击 添加 ,按照以下内容设置相关参数,然后单击 确定

      自定义

      参数

      说明

      示例

      响应头操作

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

      增加

      自定义响应头参数

      需要设置为 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

      开启

    • 设置跨域请求方法

      单击 添加 ,按照以下内容设置相关参数,然后单击 确定

      请求方法

      参数

      说明

      示例

      响应头操作

      需要设置为 增加

      增加

      自定义响应头参数

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

      Access-Control-Allow-Methods

      响应头值

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

      GET

      是否允许重复

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

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

      不允许

配置示例

示例一

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

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

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

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

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

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

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

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

示例二

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

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

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

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

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

常见问题

为什么配置了Access-Control-Allow-Origin响应头,但访问资源仍提示跨域问题,且response header中没有该响应头?