Safari拦截同顶级域名下iframe问题求助
Safari下跨子域名postMessage跨域问题解决方案及生产环境预判
当前问题(web.test.company.cloud ↔ tasks.test.company.cloud)
Safari对同源策略的实现比其他浏览器更严格:即使两个域名共享同一顶级父域,默认也不会被判定为同源。这就是你只在Safari中遇到该错误的原因。
可行解决方案
统一document.domain
在父页面和iframe页面的代码最顶部(DOM加载前)添加以下代码,将两者的domain统一到共同的父域层级:// 父页面(web.test.company.cloud) document.domain = 'test.company.cloud'; // iframe页面(tasks.test.company.cloud) document.domain = 'test.company.cloud';规范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`; } });检查Safari隐私设置
若上述方案无效,检查是否开启了Safari的「阻止跨站跟踪」功能(设置→隐私与安全性)。该功能可能会干扰document.domain的生效,测试时可暂时关闭确认。
生产环境预判(company.cloud ↔ tasks.company.cloud)
会出现相同的Safari跨域问题。这两个域名仍属于不同子域名,Safari默认不视为同源。解决方式与当前场景一致:
- 在父页面和iframe页面中都设置
document.domain = 'company.cloud'; - 保持postMessage的origin验证逻辑正确
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

