请求CDN加速域名出现跨域问题并提示“The 'Access-Control-Allow-Origin' header has a value 'xxx' that is not equal to the supplied origin”
更新时间:
问题描述
请求CDN加速域名出现跨域报错,具体信息如下:
The 'Access-Control-Allow-Origin' header has a value 'xxx' that is not equal to the supplied origin
从问题描述的内容可以看出,CDN响应的Access-Control-Allow-Origin跨域头的Value值,和客户端请求的Origin跨域头不一致,导致浏览器没有响应这个请求。例如,请求跨域头为“Origin:http://域名A”,但是响应的跨域头为“Access-Control-Allow-Origin:http://域名B”。出现该问题的原因有以下三种情况:
这种情况需要修改CDN的跨域头配置,配置成和客户端请求的Origin一致。目前CDN默认只能配置一个跨域头,如果实际业务里存在多个Origin的情况下,CDN的跨域响应头值可以配置成“*”,如何配置详情请参见 CDN如何通过HTTP头配置跨域资源共享(CORS) 。
第一次客户端请求的时候,请求跨域头为“Origin:http://域名A”,CDN没有命中缓存,按照规则去回源,由于源站配置了跨域头,响应了“Access-Control-Allow-Origin:http://域名A” ;第二次客户端请求的时候,请求跨域头为“Origin:http://域名B”,但是由于CDN之前已经缓存了第一次请求的数据,从而会直接返回缓存数据,而缓存数据里跨域响应头为“Access-Control-Allow-Origin:http://域名A”,这就导致响应的值和客户端不匹配,导致被浏览器拒绝访问。针对这种情况有以下两种解法:
源站不用配置跨域头,直接在CDN上配置跨域头即可。然后刷新CDN的缓存,将历史缓存都清除掉,如何刷新请参见 刷新和预热资源 。
在CDN上配置Access-Control-Allow-Origin响应头参数时,将 是否允许重复 选择为 不允许 即可,这种情况下当源站响应跨域头时,CDN会去掉源站的响应头,按照CDN的跨域响应头规则响应给客户端。
第一次客户端请求的时候,请求跨域头为“Origin:http://域名A”,CDN响应了“Access-Control-Allow-Origin:http://域名A” ;第二次客户端请求的时候,请求跨域头为“Origin:http://域名B”,但是由于浏览器缓存了上一次请求的结果,直接返回了缓存数据,而缓存数据里跨域响应头为“Access-Control-Allow-Origin:http://域名A”,导致响应的值和客户端不匹配,导致被浏览器拒绝访问。
出现这种问题时,需要强制浏览器的缓存。且为了避免这种情况的发生,建议在CDN上配置Cache-Control为no-cache,强制浏览器不缓存数据。
文档内容是否对您有帮助?