配置跨域资源共享

通过在边缘安全加速 ESA上配置HTTP响应头,为网站启用跨域资源共享CORS(Cross-Origin Resource Sharing),从而允许浏览器安全地从不同源加载和访问资源。

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

image

Web应用通常采用前后端分离的架构,前端应用(例如 http://example.com)需要从后端API(例如 http://example.org/api)获取数据。由于浏览器的同源策略限制,默认情况下,这种跨源的HTTP请求会被禁止,导致前端应用无法正常工作。image

通过在边缘节点配置CORS策略,解决此跨域访问问题。实现浏览器能够验证来自 http://example.org/api 的响应,并允许 http://example.com 的脚本访问这些响应数据,同时确保只有授权的源才能进行访问。

方案架构

CORS的实现依赖于浏览器与服务器之间的一套HTTP头部协商机制。将CORS配置部署在ESA边缘节点,可以在请求到达源站之前处理跨域逻辑,从而在ESA网络的边缘实现统一的策略管理。

image
  1. 请求发起:位于 http://example.com 的前端应用发起请求,访问http://example.com/index.html资源。

  2. 边缘节点处理ESA边缘节点判断请求内容是否存在缓存,若有则直接返回缓存内容,若无则回源获取并缓存后返回。

  3. 边缘节点响应:成功响应客户端请求内容(index.html文件),返回200 OK

  4. 客户端处理:客户端执行HTML中的脚本。

  5. 跨域请求发起:客户端针对脚本中的跨域内容发起请求GET http://example.org/api,并带有请求头Origin:http://example.com

  6. 边缘节点处理跨域请求:根据请求特征判断是否符合规则条件(例如:标头Origin的值等于http://example.com),若满足则添加CORSAccess-Control-Allow-Origin:http://example.com

  7. 边缘节点响应跨域请求:成功响应跨域请求内容,返回200 OK

  8. 客户端处理跨域请求:客户端检查响应头中的 Access-Control-Allow-Origin 是否匹配当前页面源(http://example.com),若匹配则正常响应并展示内容

配置示例:开启跨域资源共享

说明

若使用OSS作为源站,OSSESA控制台同时配置CORS,ESA的配置将覆盖OSS跨域设置

针对所有请求生效

场景描述

允许当前站点(如example.com)下的所有请求均可跨域访问任意地址上的资源。

配置步骤

  1. ESA控制台,选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择规则 > 转换规则,在转换规则页面选择修改响应头页签,选择响应头位置为ESA到客户端,单击新增规则按钮。image

  3. 新增修改响应头规则页面根据业务需求填写相关字段。可参考以下填写:

    1. 规则名称:填写自定义规则名称,如rule-cors-for-all

    2. 如果请求匹配以下规则...:设置规则条件,用于匹配和过滤客户端请求。本例中选择所有传入请求即可。

    3. 则执行…:设置修改响应头的规则执行动作,本例中填写:

      • 类型:选择静态

      • 操作方式:选择添加

      • 响应头名称:输入Access-Control-Allow-Origin

      • 响应头值:输入*

    image

配置效果

在进行任意跨域请求时,ESA都会在响应头中增加Access-Control-Allow-Origin:*,浏览器即可成功响应并展示跨域资源。

image

针对指定请求生效

场景描述

针对客户端请求中携带的origin标头的值包含域名example.com下的任意子域名,并且同时支持http协议和https协议,例如以下情况都允许跨域访问资源:

  • origin:http://www.example.com

  • origin:https://www.example.com

  • origin:http://image.example.com

  • origin:https://image.example.com

在响应中添加CORS头,CORS响应头内容与请求头中的origin一致。

配置步骤

  1. ESA控制台,选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择规则 > 转换规则,在转换规则页面选择修改响应头页签,选择响应头位置为ESA到客户端,单击新增规则按钮。image

  3. 新增修改响应头规则页面参考以下填写:

    1. 规则名称:填写自定义规则名称,如rule-cors-origin

    2. 如果请求匹配以下规则...:设置规则条件,用于匹配和过滤客户端请求,只对满足特定条件的请求执行添加响应头的操作。本例中填写标头 origin的值 与正则表达式匹配 ^https?://(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+example\.com$

    3. 则执行…:设置修改响应头的规则执行动作,本例中填写:

      • 类型:选择动态

      • 操作方式:选择添加

      • 响应头名称:输入Access-Control-Allow-Origin

      • 响应头值:输入http.request.headers["origin"]

    image

配置效果

在进行跨域请求时,请求中的origin头符合规则时,则ESA将在响应头中增加Access-Control-Allow-Origin标头,标头值内容与客户端请求中携带的Origin标头的值相同,浏览器即可成展示跨域资源。

image