iframe嵌入网站点击链接跳转至原站问题求助(附PHP代码)
解决iframe内嵌网站点击链接跳转原网站的问题
我来帮你搞定这个问题!你遇到的情况是因为iframe里加载的页面链接要么是原网站的绝对URL,要么没有指定在iframe内打开的目标,点击后浏览器就直接跳出iframe跳转至原网站了。结合你用PHP file_get_contents 拉取内容的思路,咱们可以通过修改拉取到的HTML内容来拦截这些跳转,让所有链接都在iframe内或者通过你的代理页面加载。
核心问题分析
- 原网站的链接都是绝对URL(比如
http://anusha.bluethink.in/b4bstaging/personalised-balls.html),点击后浏览器直接加载外部域名,跳出iframe。 - 部分链接可能设置了
target="_top"或target="_parent",强制在顶级窗口打开,直接跳出iframe。 - 原网站的静态资源(CSS、JS、图片)如果是相对路径,直接拉取后会在你的域名下找不到,导致页面样式/功能失效。
解决方案:PHP代理页面修改链接与资源路径
我们可以把 demo1.php 改成一个代理页面,负责拉取目标网站内容并自动修改所有链接和资源路径,让它们都指向代理页面,从而实现站内跳转不跳出iframe。
完整的demo1.php代码
<?php // 允许访问的目标网站URL列表(安全起见,限制可代理的地址) $allowedSites = [ 'http://anusha.bluethink.in/b4bstaging/', 'http://anusha.bluethink.in/b4bstaging/personalised-balls.html' ]; // 目标网站的基础URL,用于拼接相对路径 $baseSiteUrl = 'http://anusha.bluethink.in/b4bstaging/'; // 处理请求:如果有url参数且在允许列表内,加载对应页面;否则加载默认首页 $targetUrl = isset($_GET['url']) && in_array($_GET['url'], $allowedSites) ? $_GET['url'] : $allowedSites[0]; // 设置请求头,模拟浏览器访问(避免被目标网站拦截) $opts = [ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36\r\n" ] ]; $context = stream_context_create($opts); $pageContent = file_get_contents($targetUrl, false, $context); // 1. 替换所有<a>标签的href:将绝对URL和相对URL都转为代理链接,指定target="_self"在iframe内打开 // 替换绝对URL的链接 $pageContent = preg_replace( '/<a\s+href="(' . preg_quote($baseSiteUrl, '/') . '[^"]+)"/i', '<a href="demo1.php?url=$1" target="_self"', $pageContent ); // 替换相对路径的链接(比如 href="/personalised-balls.html" 或 href="about.html") $pageContent = preg_replace( '/<a\s+href="([^http][^"]+)"/i', '<a href="demo1.php?url=' . $baseSiteUrl . '$1" target="_self"', $pageContent ); // 2. 替换静态资源的路径(CSS、JS、图片等),确保从原网站加载 $pageContent = preg_replace( '/(src|href)="\/([^"]+)"/i', '$1="' . $baseSiteUrl . '$2"', $pageContent ); // 输出处理后的内容 echo $pageContent; ?>
你的iframe代码保持不变
<iframe src="demo1.php" frameborder="0" width="100%" height="800px"></iframe>
额外注意事项
- 防盗链拦截:如果目标网站有防盗链机制,
file_get_contents可能无法获取内容,你可以尝试在请求头中添加更多模拟浏览器的参数,或者使用cURL替代file_get_contents。 - 表单提交:如果原网站有表单,提交后也会跳转到原网站,你需要额外处理表单的
action属性,方法和替换链接类似,把表单action指向代理页面并处理提交逻辑。 - 同源策略:因为我们是把原网站内容拉取到自己的域名下输出,所以不会有iframe跨域修改DOM的问题,所有JS和样式都能正常运行。
内容的提问来源于stack exchange,提问作者shekhar saini
相关产品推荐
相关产品推荐

