配置回源HTTP响应头

CDN节点上的缓存过期或者没有命中缓存时,CDN节点会向源站发起请求来获取最新内容,源站返回的内容以及相关的HTTP头部信息就是回源响应头。您可以通过调整源站回源HTTP响应头,来设置缓存策略、跨域资源共享等,从而优化网站的加载速度、增强内容安全性、控制资源可访问性,并提高用户体验。

背景信息

HTTP响应头是HTTP的响应消息头的组成部分之一,可携带特定响应参数信息并传递给客户端。

当CDN节点上没有缓存用户请求的内容时,CDN会回源站拉取资源,源站收到CDN的请求后会给出响应。为了便于用户识别源站的响应信息,您可以配置回源HTTP响应头功能,改写用户源站响应报文中的HTTP Header信息。例如,改写回源响应头中Content-Type参数的值,然后再传递给客户端,以确保客户端解析正常(如果源站返回的Content-Type值有误,客户端直接解析将出现乱码,因此需要在CDN上改写)。

image
说明
  • 回源响应指源站收到CDN节点的请求后,返回给CDN节点的HTTP消息。回源HTTP响应头配置只会影响源站响应给CDN节点的HTTP消息,对于CDN节点直接响应给用户的HTTP消息不做修改。

  • 不支持对泛域名配置回源HTTP响应头。

适用场景

以下是一些常见的场景和示例:

  • 内容类型不正确:如果源站返回的内容类型(Content-Type)与实际内容不符,客户端可能会无法正确解析。例如,一个HTML文件被错误地标记为纯文本。这时可以通过配置回源响应头来修正。

    示例:将Content-Type: text/plain更改为Content-Type: text/html

  • 缓存策略控制:如果您需要对CDN缓存策略进行更精细的控制,可以调整源站的回源响应头中的Cache-ControlExpires字段。这有助于优化内容的更新频率和缓存命中率。

    示例:将Cache-Control: max-age=3600更改为Cache-Control: max-age=86400,以延长缓存有效期。CDN的默认缓存规则具体请参见阿里云CDN默认缓存规则及优先级

  • 跨域资源共享(CORS):如果您希望允许其他域名的Web应用访问CDN上托管的资源,则需要在源站设置Access-Control-Allow-Origin和其他相关的CORS头。这些设置确保在浏览器执行跨域请求时,CDN能够提供适当的响应头给客户端,避免CORS错误。关于跨域访问问题,您可以参见配置跨域资源共享

    示例:

    • Access-Control-Allow-Origin: *:允许所有域名进行跨域资源请求。

    • Access-Control-Allow-Methods: GET, POST, OPTIONS:指定允许跨域请求的HTTP方法。

  • 压缩传输:如果源站支持压缩传输但没有启用,或者使用的压缩算法不是最有效的,可以通过设置回源响应头中的Accept-Encoding来让源站使用最优的压缩方式。

    示例:将Accept-Encoding: gzip, deflate更改为Accept-Encoding: br,以优先使用Brotli压缩。关于Brotli压缩相关内容具体请参见Brotli压缩

  • 重定向:当源站需要重定向用户到另一个URL时,回源响应头可以设置正确的重定向响应头。关于重定向具体请参见配置回源301/302跟随

    示例:Location: https://www.example.com/new-page.html:通知CDN及用户浏览器新的资源位置,用于301或302重定向。

  • 自定义回源行为:在某些情况下,源站可能需要提供一些自定义的头部信息给客户端,以实现特定的功能或跟踪目的,您可以通过配置回源响应头来添加这些自定义头部。

注意事项

在添加了多条配置的情况下,配置的执行顺序是按配置列表从上到下的顺序逐条执行,因此需要注意对名称相同的“HTTP响应头”的多个配置操作将会叠加,最终结果可能会与预期不符。例如:

  • 配置1:增加HTTP响应头:cache-control: max-age=3600

  • 配置2:增加HTTP响应头:cache-control: no-cache

以上两个配置叠加的结果是配置2最终生效

操作步骤

  1. 登录CDN控制台

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

  3. 域名管理页面,找到目标域名,单击操作列的管理

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

  5. 单击回源HTTP响应头页签。

  6. 单击添加

  7. 配置回源HTTP响应头信息。

    重要

    当不同的操作方式同时作用于同一个回源响应头参数时,会存在操作冲突。此时按照操作类型的优先级来执行,优先级顺序为替换增加变更删除。例如,当增加和删除操作同时作用于同一个参数时,会先增加再删除。

    增加响应头参数

    HTTP响应头

    配置项

    示例

    说明

    响应头操作

    增加

    在回源HTTP请求中增加指定的响应头参数。

    自定义响应头参数

    自定义缓存响应头

    选择自定义缓存响应头或选择已经预设好的响应头参数。

    自定义响应头名称

    x-code

    自定义响应头名称为x-code。

    响应头值

    key1

    一个响应头参数中可以配置多个值,多个值用英文逗号(,)分隔。

    key1,key2

    是否允许重复

    允许

    • 允许:可以添加重复的响应头参数。例如x-code:key1x-code:key2

    • 不允许:添加同一个响应头参数,新值将覆盖旧值。例如先添加x-code:key1,再添加x-code:key2,最终的值为x-code:key2

    规则条件

    不使用

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    • 不使用:不使用规则条件。

    • 选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎

    删除响应头参数

    删除

    配置项

    示例

    说明

    响应头操作

    删除

    删除所有与响应头参数名称匹配的参数值,无论是否有重复的响应头参数。

    自定义响应头参数

    自定义缓存响应头

    选择自定义缓存响应头或选择已经预设好的响应头参数。

    自定义响应头名称

    x-code

    自定义响应头名称为x-code。

    规则条件

    不使用

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    • 不使用:不使用规则条件。

    • 选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎

    变更响应头参数

    变更

    配置项

    示例

    说明

    响应头操作

    变更

    当响应头参数不存在重复时,可以正常变更参数,如果有多个重复的响应头参数,则不允许变更。

    自定义响应头参数

    自定义缓存响应头

    选择自定义缓存响应头或选择已经预设好的响应头参数。

    自定义响应头名称

    x-code

    自定义响应头名称为x-code。

    响应头变更为

    key1,key3

    一个响应头参数中可以配置多个值,多个值用英文逗号(,)分隔。

    规则条件

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    • 不使用:不使用规则条件。

    • 选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎

    替换响应头参数

    替换

    配置项

    示例

    说明

    响应头操作

    替换

    当响应头参数不存在重复时,可以正常替换参数,如果有多个重复的响应头参数,则不允许替换。

    自定义响应头参数

    自定义缓存响应头

    选择自定义缓存响应头或选择已经预设好的响应头参数。

    自定义响应头名称

    x-code

    自定义响应头名称为x-code。

    查找

    key

    正则表达式查找需要替换的参数值。

    替换为

    abc

    正则表达式替换需要替换的参数值。

    匹配

    匹配所有

    • 匹配所有:所有匹配上的值都会被替换。例如x-code:key1,key2,key3,正则匹配值key替换为abc,替换后的结果为x-code:abc1,abc2,abc3

    • 仅匹配第一个:只有第一个匹配上的值会被替换。例如x-code:key1,key2,key3,正则匹配值key替换为abc,替换后的结果为x-code:abc1,key2,key3

    规则条件

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    • 不使用:不使用规则条件。

    • 选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎

  8. 单击确定

默认预设响应头

阿里云CDN默认预设了Cache-Control、Content-Type、Expires、Last-Modified四个回源HTTP响应头,这四个响应头是HTTP协议中的重要组成部分,它们分别用于控制缓存、定义内容类型、设置过期时间以及记录资源的最后修改时间。

CDN默认预设响应头

说明

示例

Cache-Control

用于控制资源在CDN缓存中的行为和时间周期的头信息。它为CDN节点和客户端浏览器提供了缓存指示,例如何时缓存内容、缓存多久,以及缓存的内容何时被认为是过时的。优先级高于旧的Expires头部。

  • Cache-Control: no-cache强制在使用缓存的资源之前总是向源站进行验证。

  • Cache-Control: max-age=3600指示资源在3600秒(1小时)内是新鲜的,可以从CDN缓存中提供,无需回源。

Content-Type

描述了返回给客户端的资源的数据类型。它帮助客户端正确地解释和显示接收到的数据。CDN使用这个头信息来处理对应的数据类型以及如何传输它们。

  • Content-Type: text/html表示发送的内容是HTML格式。

  • Content-Type: image/jpeg表示资源是JPEG图像格式。

Expires

提供了一个具体的日期/时间,这个时间点之后资源被认为是过期的。CDN使用这个头来确定资源是否仍然有效,如果过期,CDN将回源请求新的资源。Expires响应头是一个相对古老的头部,在HTTP/1.1中,Cache-Control头部提供了更细粒度的控制,因此Expires的使用已经逐渐减少。

Expires: Thu, 01 Dec 2023 16:00:00 GMT指出在指定的GMT时间后,内容过期。

Last-Modified

表示资源最后一次被修改的时间。CDN和浏览器使用这个响应头来判断自从该资源上次被缓存后是否有被修改过。

Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT显示资源最后修改的时间。

配置示例

示例一:配置响应文档属于某种MIME类型

配置场景

如果您希望配置响应文档属于某种MIME类型。

说明

MIME类型主要包含以下几类:

  • 文本类型:包括文本文件(例如.txt、.csv)和HTML文件(例如.html、.htm、.shtml)。

  • 图片类型:包括常见的图片文件(例如.jpg、.png、.gif)。

  • 音频类型:包括音频文件(例如.mp3、.wav)。

  • 视频类型:包括视频文件(例如.mp4、.avi)。

  • 应用程序类型:包括应用程序文件(例如.pdf、.doc、.xls)。

配置方法

  • 响应头操作:增加

  • 自定义响应头名称:Content-Type。

  • 响应头值:text/html。

配置

结果说明:在源站发送给CDN节点的响应信息中声明内容类型为text/html,再次配置将覆盖旧值。

示例二:删除响应头信息

配置场景

如果您希望删除响应头信息。

配置方法

  • 响应头操作:删除

  • 自定义响应头名称:Content-Type。

配置

结果说明:删除请求头中的Content-Type信息,然后返回给用户。

说明

如果同时完成了示例一示例二,那么会先增加响应头Content-Type信息(响应的内容属于text/html类型),然后删除该请求头,最终结果为:响应的资源没有MIME类型限制,直接以最初的类型返回用户。

常见问题

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

如果您在阿里云CDN中配置了回源响应头,如Access-Control-Allow-Origin等,但是在客户端访问资源时遇到跨域问题,并且在响应头(response header)中没有看到这些配置的响应头,可能原因有以下几点:

可能的原因

  1. 配置未生效或错误:可能是配置没有正确设置或尚未生效,导致CDN没有按照预期返回跨域响应头。

  2. CDN缓存:CDN节点可能缓存了旧的响应头信息,这会导致即使您已更改配置,也仍然返回旧的头信息。

  3. 源站问题:如果您在CDN上配置了跨域响应头,但是源站的响应中也包含了跨域响应头,并且这些响应头与CDN的配置冲突,这可能会导致问题。在这种情况下,需要统一CDN和源站的配置。

  4. 浏览器缓存:浏览器可能缓存了旧的响应,导致它并未发起新的请求以获取更新后的响应头。

解决方案

  1. 验证配置:确认CDN配置已正确设置并且已经生效,特别是跨域相关的响应头设置。

  2. 清除CDN缓存:您可以使用CDN的刷新功能清空已缓存的内容,然后再次访问资源。具体请参见刷新和预热资源

  3. 检查源站设置:确认源站不会返回与CDN配置冲突的跨域响应头。建议将源站回源响应头与节点响应头中的跨域头设置为也一致,如果配置不一致,可能会导致冲突。

  4. 清除浏览器缓存:清空浏览器缓存,或使用无痕(隐私)模式测试,确保浏览器获取最新的响应头。

  5. 联系技术支持:如果您尝试了上述所有方法,但问题仍然存在,可能是CDN服务方面的问题。请联系阿里云CDN的技术支持或提交工单寻求帮助。

怎么检查源站上正确设置了Access-Control-Allow-Origin等响应头?

如果您的源站为阿里云服务器ECS

您需要确保在ECS上运行的Web服务器或应用程序正确设置了Access-Control-Allow-Origin以及其他CORS(跨源资源共享)相关的响应头,可以按照以下步骤进行:

  1. 登录ECS管理控制台访问您的ECS实例。

  2. 检查Web服务器跨域配置。

    跨域响应头的配置可能因您使用的Web服务器或应用程序而异。常见的Web服务器有Apache、Nginx等。

    Apache

    .htaccess文件或服务器配置文件(如httpd.confvhosts.conf)中查找类似以下内容:

    Header set Access-Control-Allow-Origin "*"

    或者,对于特定的域名:

    Header set Access-Control-Allow-Origin "http://example.com"

    确认这些配置是否存在,并已经正确设置。

    Nginx

    在Nginx配置文件(通常是/etc/nginx/nginx.conf/etc/nginx/sites-available/default)中,找到与您的应用相关的server块,并检查如下设置:

    location / {
    	add_header 'Access-Control-Allow-Origin' '*';
    }

    或者,对于特定的域名:

    location / {
    	add_header 'Access-Control-Allow-Origin' 'http://example.com';
    }

    确认这些配置是否存在,并已经正确设置。

  3. 重启Web服务器。

    在修改配置文件后,需要重启Web服务器以使更改生效。例如对于Apache和Nginx,您可以使用以下命令重启服务器。

    • 对于Apache:

      sudo service apache2 restart
    • 对于Nginx:

      sudo service nginx restart
  4. 浏览器验证响应头。

    使用开发者工具的“网络”面板访问您的资源,检查是否在响应头中看到Access-Control-Allow-Origin。如果看不到,可能是配置没有生效,或者存在CDN缓存。

如果您的源站为阿里云对象存储OSS

阿里云OSS支持跨域资源共享(CORS),您可以通过OSS控制台检查OSS上是否正确设置了Access-Control-Allow-Origin等响应头,可以按照以下步骤进行:

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据安全 > 跨域设置

  4. 在跨域规则列表中,检查规则中是否包含Access-Control-Allow-Origin的配置项,并确认其值是否正确。

    • 如果您希望允许任何源访问,Access-Control-Allow-Origin应设置为*

    • 如果您只想允许特定的源访问,Access-Control-Allow-Origin应设置为具体的源地址,如https://yourdomain.com

  5. 检查其他相关跨域头。

    除了Access-Control-Allow-Origin外,可能还需要检查以下CORS相关头部是否已经正确配置:

    • Access-Control-Allow-Methods:指定允许的HTTP方法,如GET,POST,PUT,DELETE等。

    • Access-Control-Allow-Headers:指定允许的自定义请求头,如果请求中包含了非标准的头部字段。

    • Access-Control-Max-Age:指定预检请求(OPTIONS)的结果能够被缓存的最大时间。

  6. 保存和测试。

    如果发现设置不正确或需要更新,按照提示修改相应的值,然后保存更改。保存后,可能需要等待一段时间让更改生效。

关于OSS跨域配置相关详细说明,请参见跨域设置

如果在以上步骤中遇到问题或仍然无法解决问题,请联系阿里云CDN的技术支持或提交工单寻求帮助。