Access-Control-Allow-Origin多值错误:getJSON请求异常排查
问题原因
你遇到的'Access-Control-Allow-Origin' header contains multiple values '* , *'错误,根源在你的.htaccess配置重复设置了跨域头:
$.getJSON会自动给请求加上Accept: application/json头,触发了配置里的SetEnvIf Accept application/json API规则,此时第一条带env=API的Access-Control-Allow-Origin: *会生效- 配置最后一行的
Header set Access-Control-Allow-Origin "*"没有任何条件限制,所有请求都会触发这条规则 - 两个规则同时生效,导致响应头里出现两个
*,违反了CORS规范只能设置一个源的要求
而$.GET或$.POST默认不会携带Accept: application/json头,不会触发API环境变量,只有最后一行的规则生效,因此不会报错。
解决方案
修改.htaccess,移除重复的跨域头设置,推荐两种方案:
方案一:区分请求类型设置(推荐)
保留针对JSON请求的精细化配置,同时给非JSON请求单独设置基础跨域规则:
<IfModule mod_headers.c> # 针对JSON请求配置完整CORS规则 SetEnvIf Accept application/json API Header always set Access-Control-Allow-Origin "*" env=API Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" env=API Header always set Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization" env=API # 针对非JSON请求设置基础跨域规则(按需保留) SetEnvIf Accept !application/json NON_API Header set Access-Control-Allow-Origin "*" env=NON_API </IfModule>
方案二:全局统一设置
如果不需要区分JSON和非JSON请求的跨域规则,直接保留一套全局配置即可:
<IfModule mod_headers.c> Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization" </IfModule>
验证修改
修改后让.htaccess生效(部分服务器需重启),再用$.getJSON发起请求,此时响应头只会存在一个Access-Control-Allow-Origin: *,错误即可解决。
内容的提问来源于stack exchange,提问作者massimiliano comunale
相关产品推荐
相关产品推荐

