子域名间CORS配置为什么还是被拦截?

长春 阅读 26

我在做子域名间的数据交互时遇到了CORS问题。主域名是example.com,后端接口在api.example.com,前端在www.example.com发起请求。按照教程设置了Access-Control-Allow-Origin为www.example.com,但控制台还是报跨域被拦截的错误,提示”Response to preflight request doesn’t pass access check”。

后端用的是PHP,配置了这样的响应头:


header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Methods: GET,POST');

但依然不行。试过把origin设为通配符*能成功,但这样不安全。是不是子域名需要特殊配置?或者还有其他响应头没配全?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
轩辕艳青
搞子域名跨域确实容易踩坑,我来帮你捋一下。你遇到的问题主要是预检请求没通过,光配那两个响应头是不够的。

在WordPress环境下,你需要额外处理OPTIONS请求,并且把相关头部都加上去。给你一个完整的解决方案:


function custom_cors_headers() {
// 允许的来源
$allowed_origin = 'https://www.example.com';

// 处理预检请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
header("Access-Control-Allow-Origin: $allowed_origin");
header('Access-Control-Allow-Methods: GET,POST,OPTIONS');
header('Access-Control-Allow-Headers: Content-Type,Authorization');
header('Access-Control-Max-Age: 86400'); // 缓存预检结果一天
exit;
}

// 正常请求的响应头
header("Access-Control-Allow-Origin: $allowed_origin");
header('Access-Control-Allow-Credentials: true');
}

add_action('init', 'custom_cors_headers');


几个关键点说一下:首先你得处理OPTIONS请求,这是浏览器在正式请求前会发的预检;其次要加上Allow-Headers,特别是如果你用了自定义header或者带认证的话;最后别忘了Allow-Credentials,这个在子域名场景下经常需要。

如果嫌麻烦,插件可以搞定这个事。安装"WP CORS"插件,它能帮你自动处理这些配置。不过建议还是自己写代码控制,毕竟涉及到安全问题。

记得清空浏览器缓存再测试,有时候浏览器会缓存错误的CORS配置,搞得人怀疑人生。我之前就在这上面浪费了大半天时间。
点赞 3
2026-02-17 20:07