PHP里想“当前页面直接显示另一个网页”,当前最粗暴的页面页办法就是 `readfile()`。比如你写个聚合页,显示想把新浪首页塞进来,其网一行 `readfile('https://www.sina.com.cn')` 就完事。当前但这玩意儿有个坑——对方服务器返回的页面页HTTP头(比如`Content-Type`)会原样透传,如果对方页面是显示`gb2312`编码而你自己的页面是`UTF-8`,那满屏乱码能让你怀疑人生。其网
更常见的当前做法是 `file_get_contents()` 配合 `echo` 输出。我去年做个内部工具,页面页需要把公司老系统的显示报表直接嵌到新框架里,就是其网这么干的。但注意,当前`file_get_contents` 默认走PHP的页面页HTTP包装器,遇到对方返回`404`或者连接超时,显示它会直接抛警告,整个页面白屏。你得先 `@` 抑制错误,再判断返回值是不是`false`,不然用户看到的就是半截页面加一行红字警告。
还有个进阶玩法是cURL。为什么用cURL?因为你能控制超时时间、设置User-Agent、带Cookie。比如你要抓一个需要登录的页面,cURL可以帮你先POST用户名密码拿Session,再GET目标页面。但cURL返回的是完整HTML字符串,你得自己处理相对链接——页面里的`src="/img/a.png"`如果直接输出,浏览器会去请求你当前域名下的`/img/a.png`,结果全是404。这时候得用正则或者DOMDocument把链接替换成绝对地址,麻烦是麻烦,但能救命。
以上都是“服务端拉取”。但如果你要显示的是别人网站,而且对方禁止了跨域或者有反爬机制,服务端拉取经常拿到一堆验证码页。这时候换个思路——用iframe。HTML的iframe天生就是干这个的,`` 扔到你的PHP页面里,浏览器会直接去请求那个地址,完全绕过PHP的限制。但iframe有个烦人的问题:对方网站如果设置了`X-Frame-Options: DENY`,你页面里就只显示一个空白框。比如Google搜索页就禁止被iframe嵌入,你硬嵌上去,Chrome控制台会告诉你“拒绝连接”。
实际干活的时候,我见过不少新手混用这两种方式。去年帮朋友改个导航站,他先用`file_get_contents`抓了百度首页,然后用正则把`
`里的内容抠出来,再拼到自己页面里。结果百度那边改了个CSS类名,他的正则直接匹配失败,整个导航站首页变空白。后来我给他改成iframe,反而简单了——不管百度怎么改版,iframe显示的都是最新内容。