请求CDN加速域名出现跨域报错,具体信息如下:
The 'Access-Control-Allow-Origin' header has a value 'http://xxxx' that is not equal to the supplied origin.
从问题描述的内容可以看出,CDN 响应的 Access-Control-Allow-Origin 跨域头的 Value 值,和客户端请求的 Origin 跨域头不一致,导致浏览器没有响应这个请求。例如,请求跨域头为 “Origin:http://域名A”,但是响应的跨域头为“Access-Control-Allow-Origin:http://域名B”。出现该问题的原因有以下三种情况: 1. CDN 配置的跨域头和客户端请求的 Origin 不一致 2. 源站配置的跨域头被CDN缓存 3. 浏览器缓存
1. 解决 CDN 配置的跨域头和客户端请求的 Origin 不一致问题。
请检查 CDN 配置的跨域响应头,与客户端请求的 Origin 头是否一致。配置详情请参见文档配置 HTTP 响应头。
2. 解决源站配置的跨域头被 CDN 缓存问题。
第一次客户端请求时:
请求跨域头为 “Origin:http://域名A”,CDN没有命中缓存,按照规则去回源,由于源站配置了跨域头,响应了 “Access-Control-Allow-Origin:http://域名A” ;
第二次客户端请求时:
请求跨域头为 “Origin:http://域名B”,但是由于CDN之前已经缓存了第一次请求的数据,从而会直接返回缓存数据,而缓存数据里跨域响应头为 “Access-Control-Allow-Origin:http://域名A”。
这就导致响应的值和客户端不匹配,导致被浏览器拒绝访问。针对该请求可以尝试以下方法: 源站不用配置跨域头,仅在 CDN 上配置跨域头即可。配置完成后刷新 CDN 的缓存,将历史缓存都清除掉。再次尝试浏览器访问观察问题是否解决。
3. 解决浏览器缓存问题。
第一次客户端请求时,请求跨域头为 “Origin:http://域名A”,CDN响应了“Access-Control-Allow-Origin:http://域名A” ;
第二次客户端请求时,请求跨域头为 “Origin:http://域名B”,但是由于浏览器缓存了上一次请求的结果,直接返回了缓存数据,而缓存数据里跨域响应头为 “Access-Control-Allow-Origin:http://域名A”, 导致响应的值和客户端不匹配,导致被浏览器拒绝访问。
出现这种问题时,需要强制浏览器的缓存。且为了避免这种情况的发生,建议在 CDN 上配置 Cache-Control 为 no-cache ,强制浏览器不缓存数据。 如果您有其他问题,欢迎您联系火山引擎技术支持服务