CORS域名验证时,为什么多个子域名配置会覆盖之前的规则?

皇甫培培 阅读 47

我在配置CORS时遇到奇怪的问题,后端设置了允许两个子域名api.example.comtest.example.com,但实际请求时只有最后一个配置生效。比如先写:


header("Access-Control-Allow-Origin: https://api.example.com");
header("Access-Control-Allow-Origin: https://test.example.com");

结果浏览器报错说响应头的Access-Control-Allow-Origin值不符合请求来源https://api.example.com。试过调换顺序、用数组写法都不行,难道CORS不支持多个域名?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
UI蒙蒙
UI蒙蒙 Lv1
你遇到的问题是因为 HTTP 响应头 Access-Control-Allow-Origin 不允许重复设置。当你用 PHP 的 header() 函数连续调两次,实际上第二个会覆盖第一个,最后只有 https://test.example.com 生效,所以来自 api.example.com 的请求就被拦了。

CORS 本身是支持多域名的,但不能靠重复写 header 来实现。正确的做法是在后端动态判断请求来源,然后只返回匹配的那个 origin。

更好的写法是这样:

$allowedOrigins = [
'https://api.example.com',
'https://test.example.com'
];

$origin = $_SERVER['HTTP_ORIGIN'] ?? '';

if (in_array($origin, $allowedOrigins)) {
header("Access-Control-Allow-Origin: $origin");
}

header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");


注意这里关键点:只能返回一个 origin,并且必须完全匹配。别忘了预检请求(OPTIONS)也要正确响应。

另外别把这逻辑写死在每个脚本里,最好封装成中间件或公共函数,不然以后加域名又要到处改。
点赞 4
2026-02-10 20:01