关于iframe

29 阅读2分钟

🧭 如何判断你的 iframe 是否被跨域限制?

✔️ 可以显示画面

说明:URL 可访问,没有阻止。

✔️ 但开发者工具里 DOM 是灰色

说明:跨域了,不能操作 iframe 内容。

❌ 如果页面直接报错、iframe 空白

说明:Chrome 根据 私有网络访问限制 阻止了。


⭐⭐⭐⭐⭐小知识:通信(同源/跨域)

1)你需要操作 iframe 内的内容 → 必须同源

方案:

方案 A:让两个页面同源(最推荐)

同域后 DOM 可操作。


方案 B:使用 postMessage 进行跨域通信

浏览器唯一允许的跨域页面交互方式:

iframe.contentWindow.postMessage({type: "hello"}, "*");

iframe 内监听:

window.addEventListener("message", (e) => {
  console.log(e.data);
});

适合你 ScriptCat 的场景。

🍎❗❗❗❗❗❗

问题:【 只要 iframe 与外层页面是不同源(origin 不同:协议/域名/端口任一不同),浏览器就会执行 同源策略 这个时候如何解决呢,我只想在一个系统页面的元素中插入一个iframe标签,放入我自己的url连接展示 】

先说一句结论:
你这种“只是想在系统页面里展示自己页面”的需求,本身不需要解决同源问题,iframe 不同源也能展示。
真正拦你的,是浏览器的“安全网络访问”和“混合内容”规则。


1. 同源策略不会挡住“纯展示”

  • 同源策略只限制:JS 互相访问 DOM / Cookie / storage
  • 不限制:把一个外站页面 iframe 出来显示

所以,正常情况 <iframe src="https://你的域名/xxx.html">,就算和外层完全不同源,也是可以显示的。


2. 你现在被拦的真正原因

结合你之前的截图:

  • 外层页面:公司系统页面(通常是公网域名 + 多半是 HTTPS)
  • iframe:http://localhost/audioScriptsCopy2/...

这时触发了两个安全规则里的至少一个:

  1. 公网页面 → 访问本机 / 内网 (localhost / 192.168.x.x)
    Chrome 会认为“公网网站正访问你专用网络设备”,直接拦截,并弹那句:

    此连接已被禁止,因为它是由某个公共网页为连接至您专用网络上的设备或服务器而发起的……

  2. 外层是 HTTPS,iframe 是 HTTP(混合内容)
    现代浏览器默认会拦。

所以,你看到的不是“同源策略导致 iframe 不展示”,而是 网络安全策略把请求直接挡了

上述这个此链接xxxx确实是一种现象,不过第二天发现使用localhost依旧是可以正常展示iframe内容的

image.png