CORS域名验证时,为什么多个子域名配置会覆盖之前的规则?
我在配置CORS时遇到奇怪的问题,后端设置了允许两个子域名api.example.com和test.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不支持多个域名?
Access-Control-Allow-Origin不允许重复设置。当你用 PHP 的header()函数连续调两次,实际上第二个会覆盖第一个,最后只有https://test.example.com生效,所以来自api.example.com的请求就被拦了。CORS 本身是支持多域名的,但不能靠重复写 header 来实现。正确的做法是在后端动态判断请求来源,然后只返回匹配的那个 origin。
更好的写法是这样:
注意这里关键点:只能返回一个 origin,并且必须完全匹配。别忘了预检请求(OPTIONS)也要正确响应。
另外别把这逻辑写死在每个脚本里,最好封装成中间件或公共函数,不然以后加域名又要到处改。