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

Safari拦截同顶级域名下iframe问题求助

Safari下跨子域名postMessage跨域问题解决方案及生产环境预判

当前问题(web.test.company.cloud ↔ tasks.test.company.cloud)

Safari对同源策略的实现比其他浏览器更严格:即使两个域名共享同一顶级父域,默认也不会被判定为同源。这就是你只在Safari中遇到该错误的原因。

可行解决方案

  1. 统一document.domain
    在父页面和iframe页面的代码最顶部(DOM加载前)添加以下代码,将两者的domain统一到共同的父域层级:

    // 父页面(web.test.company.cloud)
    document.domain = 'test.company.cloud';
    
    // iframe页面(tasks.test.company.cloud)
    document.domain = 'test.company.cloud';
    
  2. 规范postMessage的origin参数
    发送消息时明确指定目标origin(避免使用'*',提升安全性),同时在监听端验证来源:

    // iframe中发送高度消息
    window.parent.postMessage({ height: document.body.scrollHeight }, 'https://web.test.company.cloud');
    
    // 父页面监听消息
    window.addEventListener('message', (event) => {
      // 验证消息来源,防止恶意注入
      if (event.origin === 'https://tasks.test.company.cloud') {
        document.getElementById('target-iframe').style.height = `${event.data.height}px`;
      }
    });
    
  3. 检查Safari隐私设置
    若上述方案无效,检查是否开启了Safari的「阻止跨站跟踪」功能(设置→隐私与安全性)。该功能可能会干扰document.domain的生效,测试时可暂时关闭确认。

生产环境预判(company.cloud ↔ tasks.company.cloud)

会出现相同的Safari跨域问题。这两个域名仍属于不同子域名,Safari默认不视为同源。解决方式与当前场景一致:

  • 在父页面和iframe页面中都设置document.domain = 'company.cloud';
  • 保持postMessage的origin验证逻辑正确

内容的提问来源于stack exchange,提问作者Fredrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:15:38