You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:42:49