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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:30:41