WordPress多站点主站Access-Control-Allow-Origin配置异常排查
WordPress多站点跨域表单提交问题解决
问题分析
你在主站mainsite.com调用子站的Ninja Forms表单,提交时出现跨域错误(提示缺少Access-Control-Allow-Origin头)。之前的两种配置方案都没解决问题,核心误区是:你以为主站需要设置CORS头,但实际是表单提交的目标子站需要设置头,允许主站域名的跨域请求——因为浏览器是从主站页面发起请求到子站,子站的响应必须包含允许主站来源的CORS头。
另外,之前的方案失败原因:
- PHP代码方案:用了
$blog_id = 1(赋值而非比较),且执行时机可能太晚,导致HTTP头无法正常设置。 - .htaccess方案:匹配条件不精确,导致子站被误应用配置。
正确解决方案
方案1:PHP代码(推荐,精准控制)
将以下代码添加到主站或网络全局的functions.php文件中,根据需求选择控制范围:
允许主站访问所有子站的表单提交
add_action('send_headers', function() { // 替换为你的主站完整域名(包含http/https) $allowed_origin = 'https://mainsite.com'; $request_origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; // 仅当请求来自主站时,设置跨域头 if ($request_origin === $allowed_origin) { header("Access-Control-Allow-Origin: $allowed_origin"); header('Access-Control-Allow-Methods: GET, POST'); header('Access-Control-Allow-Headers: X-Requested-With, Origin, Content-Type, X-Auth-Token, Authorization'); } });
仅允许主站访问指定子站的表单提交
如果只需要特定子站开放跨域,可添加子站ID判断:
add_action('send_headers', function() { // 替换为允许的子站ID数组 $allowed_blog_ids = [2, 3]; $allowed_origin = 'https://mainsite.com'; $request_origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array(get_current_blog_id(), $allowed_blog_ids) && $request_origin === $allowed_origin) { header("Access-Control-Allow-Origin: $allowed_origin"); header('Access-Control-Allow-Methods: GET, POST'); header('Access-Control-Allow-Headers: X-Requested-With, Origin, Content-Type, X-Auth-Token, Authorization'); } });
方案2:.htaccess配置(精确匹配主站/子站)
如果坚持用.htaccess,需用正则精确匹配目标站点,避免误应用:
仅主站设置跨域头(纠正之前的匹配问题)
<If "%{HTTP_HOST} =~ /^(www\.)?mainsite\.com$/"> Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST" Header set Access-Control-Allow-Headers "X-Requested-With, Origin, Content-Type, X-Auth-Token, Authorization" </If>
子站允许主站跨域请求
如果要让子站允许主站请求,可针对子站域名添加规则:
<!-- 替换为你的子站域名,比如subsite.com --> <If "%{HTTP_HOST} =~ /^(www\.)?subsite\.com$/"> Header set Access-Control-Allow-Origin "https://mainsite.com" Header set Access-Control-Allow-Methods "GET, POST" Header set Access-Control-Allow-Headers "X-Requested-With, Origin, Content-Type, X-Auth-Token, Authorization" </If>
关键注意事项
- 确保域名包含
http://或https://,避免协议不匹配导致跨域失败。 - 如果使用CDN或缓存插件,需清空缓存后测试,避免旧响应头被缓存。
- 若仍有问题,检查浏览器控制台的具体错误信息,确认请求的来源和目标域名是否匹配配置。
内容的提问来源于stack exchange,提问作者Don Natura
相关产品推荐
相关产品推荐

