iframe 跨域,有没办法获取 iframe子页面元素

比如 我自己的网站 www.aaa.com, 用iframe 引入了 www.bb.com (是别人的网站,我不能控制),
这种情况,可以获取到吗

阅读 12.5k
1 个回答

同源策略影响,在前端是没有办法实现的,如果可以随便操作子页面的元素,那对于iframe里面的页面岂不是很危险

如果真的要操作iframe里面的元素,可以尝试用nginx代理来实现

方法一

把你的页面配置和代理转发的配置都写在一个server里面,区分不同location,这样他们的域名都是一样的,不存在跨域问题,这样配置的话,要调整好代理页面的静态问题的访问路径,例子就不给出了

方法二

写两个server, server1假定域名为aaa.xxx.com, 用作代理,返回的时候插入一段 js 代码修改domain=xxx.com, server2假定域名为bbb.xxx.com, 用作你的页面,在页面前面设置domain=xxx.com

下面给个例子,aaa.xxx.com代理www.qq.combbb.xxx.comiframe引用aaa.xxx.com, 并获取iframe的元素

首先是nginxserver配置

server {
    listen       80;
    server_name  aaa.xxx.com;

    location / {
        proxy_pass  https://www.qq.com/;
        proxy_set_header Host www.qq.com;
        proxy_set_header X-Forwarded-For $remote_addr;

        # 禁用压缩,否则替换不生效(注意:禁用压缩会带来流量上涨)
        proxy_set_header Accept-Encoding '';

        # 插入 JS 代码,编译的时候要增加 --with-http_sub_module 参数
        sub_filter '</head>' '</head><script>document.domain = \'xxx.com\';</script>';
        sub_filter_once off;   
    }
}
server {
    listen       80;
    server_name  bbb.xxx.com;
    root /home/www/bbb.xxx.com;

    location / {
    }
}

然后写一个测试代码/home/www/bbb.xxx.com/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
  <iframe style="width: 100%;height: 100%" id="iframe" src="http://aaa.xxx.com"></iframe>
</body>
<script>
  document.domain = 'xxx.com';
  var iframe = document.getElementById('iframe');
  iframe.onload = function(){
    // 获取 iframe 中 id 为 sosobar 元素
    console.log('iframe', iframe.contentWindow.document.getElementById('sosobar'));
  }
</script>
</html>

启动Nginx, 访问bbb.xxx.com查看结果

clipboard.png

可以看到,iframe已经实现跨域了,不过这样做,有些问题还是不能忽略的

  • https问题
  • 站点有检测代码
  • 通过独立域名加载的JSCSSpng,可能有跨域或者权限问题
  • 更改了domain造成某些资源无法获取

ps: 如果有好的方案欢迎分享

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题