出站响应头是HTTP响应消息头的组成部分之一,可携带特定响应参数并传递给客户端,用来控制缓存行为。通过修改出站响应头,当用户请求加速域名下的资源时,CDN返回的响应消息会携带您配置的响应头,从而实现跨域访问等特定功能。
背景信息
出站响应头是HTTP协议中用于控制缓存的机制。当客户端请求资源时,CDN节点返回的HTTP响应头允许在特定条件下缓存内容。
-
HTTP响应头的配置属于域名维度的配置,一旦配置生效,便会对域名下所有资源的响应消息生效。
-
配置HTTP响应头仅影响客户端(例如浏览器)的响应行为,不影响CDN节点的缓存行为。泛域名暂不支持修改出站响应头。
适用场景
-
告知客户端CDN响应文件的资源类型:添加响应头
Content-Type: text/html告知客户端CDN响应文件的格式是HTML格式。 -
实现跨域资源访问:当用户请求CDN上某个域名的资源时,您可以在CDN返回的响应消息中配置响应头
Access-Control-Allow-Origin,以实现跨域访问,您可以参考配置跨域资源共享来了解详细信息。阿里云CDN还支持按照已配置CORS规则对接收到的用户的跨域请求进行校验,以实现更灵活的跨域资源访问控制。 -
自定义响应行为:根据业务需求添加或修改自定义头部信息,调整客户端接收的响应内容和格式。
注意事项
在添加了多条配置的情况下,执行顺序按配置列表从上到下,因此需要注意多个配置操作将会叠加,最终结果可能会与预期不符。以下例子中配置2最终生效:
配置1:增加HTTP响应头:
cache-control: max-age=3600配置2:增加HTTP响应头:
cache-control: no-cache
引用规则条件时,按所关联规则条件的优先级匹配,而非按功能自身的配置顺序匹配。
-
CDN不支持删除或修改Via、EagleId等系统保留响应头。这些Header用于CDN节点信息记录,即使配置删除或修改也无效,系统仍会保留最后一个节点的信息。
-
出站响应头配置修改后一般在5分钟内生效,无需重新预热(预热不会改变已缓存资源的响应头)。若需确保客户端获取最新的响应头信息,请在控制台对受影响的URL执行操作步骤(清除缓存)操作后测试验证。
操作步骤
登录CDN控制台。
在左侧导航栏,单击域名管理。
在域名管理页面,找到目标域名,单击操作列的管理。
在指定域名的左侧导航栏,单击缓存配置。
-
单击 修改出站响应头 页签。
-
单击添加,修改出站响应头。
下面以增加出站响应头为例,为您介绍配置方法。
参数
说明
响应头操作
增加、删除、变更和替换指定的响应头。
自定义响应头参数
选择自定义响应头参数。详细信息,请参见响应头参数。
自定义响应头名称
当自定义响应头参数选择为自定义时,需要配置自定义响应头名称。自定义响应头名称要求如下:
-
由大小写字母、短划线和数字组成。
-
长度为1~100个字符。
响应头值
输入您要设置的响应头值。详细信息,请参见响应头参数。
是否允许重复
-
允许:保留源站返回的头,同时会加上一个同名的头。
-
不允许:源站返回的头会被新配置的同名头覆盖。
跨域验证
跨域校验默认为关闭状态,只有在响应头操作为“增加”且自定义响应头参数为“Access-Control-Allow-Origin”的时候才可以配置。
-
开启:开启状态下CDN节点将按以下规则对用户做跨域校验,并根据校验结果响应“Access-Control-Allow-Origin”的值。
-
关闭:关闭状态下CDN节点不会校验用户请求中携带的Origin头,只会固定响应已配置的Access-Control-Allow-Origin值。
跨域校验规则请参见跨域校验规则。
规则条件
规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。
重要引用规则条件时,按所关联规则条件的优先级匹配,而非按功能自身的配置顺序匹配。
-
不使用:不使用规则条件。
-
若需新增或编辑规则条件,请在规则引擎中进行管理。
-
-
单击确定,完成配置。
成功修改出站响应头后,您可以在出站响应头节点HTTP响应头列表中,对当前的配置进行修改或删除操作。
配置示例:为PDF文件配置 Cache-Control:no-cache
如果希望客户端对PDF文件进行协商缓存(每次请求都向CDN节点验证文件是否更新),可以通过规则引擎实现:
-
在添加出站响应头配置时,选择使用规则条件。
-
设置匹配条件为「文件扩展名」包含
.pdf。 -
配置动作为修改出站响应头,添加
cache-control:no-cache。
此配置仅影响CDN返回给客户端的响应头,使客户端进行协商缓存,但不影响CDN节点本身对该PDF文件的缓存策略。
跨域校验规则
是否允许重复和跨域校验这两个配置项之间存在互斥,是否允许重复配置为允许的情况下,跨域校验将会失效。
-
任意匹配:自定义响应头参数
Access-Control-Allow-Origin的值设置为*不论用户请求里面是否携带Origin参数,也不论携带的Origin参数为何值,都固定返回Access-Control-Allow-Origin:*。 -
精确匹配:自定义响应头参数
Access-Control-Allow-Origin的值设置了单个或者多个值(多个值之间用,分隔)。-
如果用户请求头里携带的
Origin参数值与被设置的任意一个值精确匹配,就会响应对应的跨域头。 -
如果都没有精确匹配上,则不响应跨域头。
-
-
泛域名匹配:自定义响应头参数
Access-Control-Allow-Origin的值设置了泛域名,则会校验请求头中Origin值是否能匹配上Access-Control-Allow-Origin的泛域名。
您可以参考配置跨域资源共享来了解如何配置。
响应头参数
|
响应头参数 |
说明 |
示例 |
|
自定义 |
支持添加自定义响应头。自定义响应头名称要求如下:
|
Test-Header |
|
Cache-Control |
指定客户端程序请求和响应遵循的缓存机制。 |
no-cache |
|
Content-Disposition |
指定客户端程序把请求所得的内容存为一个文件时提供的默认的文件名。 |
examplefile.txt |
|
Content-Type |
指定客户端程序响应对象的内容类型。 |
text/plain |
|
Pragma |
Pragma 是一个在 HTTP/1.0 中规定的通用首部,这个首部通常用于在服务器的响应中定义客户端对文件的缓存行为。 |
no-cache |
|
Access-Control-Allow-Origin |
|
|
|
Access-Control-Allow-Methods |
指定允许的跨域请求方法。多个方法用英文逗号 |
POST,GET |
|
Access-Control-Allow-Headers |
指定允许的跨域请求字段。 |
X-Custom-Header |
|
Access-Control-Expose-Headers |
指定允许访问的自定义头信息。 |
Content-Length |
|
Access-Control-Allow-Credentials |
该响应头表示是否可以将对请求的响应暴露给页面。
|
true |
|
Access-Control-Max-Age |
指定客户端程序对特定资源的预请求返回结果的缓存时间,单位为秒。 |
600 |
|
Content-Security-Policy |
配置内容安全策略(CSP),用于控制页面可以加载哪些资源,防范 XSS 攻击和数据注入等安全威胁。CDN不对CSP策略内容做语义校验,仅校验HTTP响应头基本格式。策略内容需为单行字符串,不能包含换行符、非法控制字符或未转义的引号,且不要包含外层双引号。建议先在浏览器开发者工具中验证策略正确性后再填入,或在源站配置CSP由CDN透传。 |
default-src 'self'; script-src 'self' 'unsafe-inline' |
|
Permissions-Policy |
配置权限策略,用于控制浏览器特定功能(如摄像头、麦克风、地理位置等)的访问权限。 |
camera=(), microphone=() |
-
响应头值支持配置为“*”,表示任意来源。
-
响应头值非“*”的情况下,支持配置单个或者多个IP、域名、或者IP和域名混合。相互间用英文(,)分隔。
-
响应头值非“*”的情况下,必须包含协议头“http:// ”或者“https://”。
-
响应头值支持携带端口。
-
响应头值支持泛域名。
-
CDN支持通过自定义响应头配置 Content-Security-Policy(CSP)和 Permissions-Policy 安全响应头。ALB(应用型负载均衡)本身不支持直接添加这两个安全响应头,如需配置,建议通过CDN或WAF等产品实现。
-
CSP响应头值不要包含外层双引号,这是常见的配置报错原因。正确格式示例:
default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: -
浏览器F12开发者工具中的CSP语法提示属于浏览器自身的限制,与实际请求无关,不影响响应头的实际生效,请通过实际请求验证。
常见问题
-
为什么已经配置了响应头Access-Control-Allow-Origin,但是访问资源仍提示跨域问题,response header中没有配置的响应头?
-
配置自定义响应头后未生效,如何排查?
-
DNS解析问题:确认域名DNS解析仅保留了CDN的CNAME记录,删除了OSS等源站的直接解析记录,确保流量经过CDN节点。如果流量直接到达源站,CDN配置的响应头不会生效。
-
源站未返回该响应头:CDN默认透传源站响应头,若源站未返回该Header则CDN也不会返回。请确保源站配置正确并返回该响应头;或在CDN控制台「修改出站响应头」中强制添加该响应头,CDN会在出站时自动添加。
-
Content-Type等响应头未生效:CDN配置自定义出站响应头仅在请求经过CDN时生效。若源站(如OSS、OBS)在上传文件时未指定正确的Content-Type,可能导致回源获取的元数据与预期不符。建议检查源站上传文件时的Content-Type设置,并提供具体URL进行测试验证。
-
-
修改入站响应头配置后未生效,是什么原因?
-
入站响应头:仅作用于源站返回给CDN节点之间的通信,不影响最终用户收到的响应。
-
出站响应头:影响CDN返回给最终用户的响应。
-
如果配置的是「修改入站响应头」(如修改Set-Cookie的domain字段),该配置只会影响源站到CDN节点之间的通信,终端用户不会感知到变化。如需影响终端用户收到的响应,请配置「修改出站响应头」。如仍无效,建议直接在源站修改响应头。
-
-
出站响应头配置生效时间及状态一直显示「配置中」,如何处理?
-
配置一般在5分钟内生效。若长时间显示「配置中」或未生效,请检查:
-
配置格式是否正确(如响应头值是否符合规范,是否为单行字符串)。
-
是否已单击确定完成保存。
-
尝试刷新页面或稍后再次查看状态。
-
-
-
是否支持将出站响应头配置批量添加到多个域名?
-
支持。可以使用CDN API接口
BatchSetCdnDomainConfig进行批量域名配置,通过该接口的功能参数设置响应头添加规则。
-
-
前端JavaScript代码中拿不到后端返回的自定义响应头(如filename),如何处理?
-
清除CDN缓存,确保未缓存旧响应头。
-
确认源站实际返回的响应头中包含该字段。
-
在CDN控制台「修改出站响应头」中,显式添加
Access-Control-Expose-Headers: <header-name>配置,以覆盖源站的CORS设置,确保前端JavaScript能获取该字段。例如,需要获取filename响应头时,添加Access-Control-Expose-Headers: filename。 -
使用浏览器无痕模式重新请求,确认问题是否解决。
-