WordPress开发中iframe跨域访问报错,需获取iframe内a标签信息
解决WordPress中跨域iframe访问的DOMException错误
我来帮你搞定这个跨域iframe的问题——你遇到的Uncaught DOMException完全是浏览器的**同源策略(Same-Origin Policy)**在起作用:你的主站域名是https://demo.utrop.no,而iframe加载的是其他域名的内容,浏览器出于安全考虑,绝对不允许前端JS直接跨域操作另一个域名页面的DOM。
下面给你几个可行的解决方案,结合你已经在用的PHP curl方案来优化:
方案1:通过PHP后端抓取解析(最靠谱)
既然前端跨域走不通,咱们换后端来做——你已经尝试用curl获取页面内容了,那直接优化这个逻辑,精准定位到“显示原始内容”的a标签就行:
<?php global $wpdb; // 你的原始跳转URL $originalUrl = 'https://www.retriever-info.com/go/?a=79334&d=00233220191223303391398&p=1861654&s=2332&sa=2044493&x=fe0e0a14ee1e6ad2107d665284c5082c'; // 初始化curl,合并重复的配置项 $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $originalUrl, CURLOPT_SSL_VERIFYPEER => false, // 注意:生产环境建议开启SSL验证 CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: 79334', 'Content-Type: text/html; charset=utf-8' ] ]); $html = curl_exec($ch); $finalRedirectedUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); curl_close($ch); // 用DOM解析页面,精准找目标按钮 $dom = new DOMDocument(); @$dom->loadHTML($html); // @符号忽略HTML解析警告 $xpath = new DOMXPath($dom); // 这里用XPath定位包含“显示原始内容”文本的a标签,你可以根据实际文本调整 $targetLinks = $xpath->evaluate("//a[contains(text(), '显示原始内容')]"); if ($targetLinks->length > 0) { $targetLink = $targetLinks->item(0); $linkHref = $targetLink->getAttribute('href'); // 处理相对链接,转成绝对链接 if (strpos($linkHref, 'http') !== 0) { $parsedFinalUrl = parse_url($finalRedirectedUrl); $linkHref = $parsedFinalUrl['scheme'] . '://' . $parsedFinalUrl['host'] . $linkHref; } echo "找到目标按钮链接:<strong>$linkHref</strong>"; } else { echo "未找到“显示原始内容”按钮,请检查XPath的文本匹配是否正确"; } ?>
方案2:依赖目标域名开放CORS(不推荐)
如果iframe的目标域名管理员愿意配合,让他们在服务器响应头添加:
Access-Control-Allow-Origin: https://demo.utrop.no
这样你的前端JS就能正常访问iframe的DOM了,但第三方网站几乎不会为你单独开放这个权限,所以这个方案实用性很低。
方案3:绕开iframe直接提供链接
如果你的需求是让用户能点击“显示原始内容”,那完全可以用PHP抓取到目标链接后,直接在WordPress页面上生成一个跳转按钮,比如:
// 接上面的代码,找到$linkHref后 echo '<a href="' . esc_url($linkHref) . '" target="_blank" class="button">显示原始内容</a>';
这样用户直接点击就能跳转,完全不用操作iframe,更简单安全。
最后说下你的前端代码为什么报错
你写的myFunction()里直接用iframe.contentWindow.document访问跨域iframe的DOM,这刚好撞在了浏览器同源策略的枪口上——只要两个页面域名、协议、端口有一个不一样,这个操作就会被浏览器拦截,所以前端这条路走不通,必须靠后端中转。
内容的提问来源于stack exchange,提问作者Mathula Shanmugaratnam
相关产品推荐
相关产品推荐

