如何在iframe中显示google.com?


121

我正在尝试将google.com放到我网站上的iframe中,这可与包括yahoo在内的许多其他网站一起使用。但它不适用于Google,因为它只显示一个空白的iframe。为什么不渲染?有什么窍门吗?

我已经尝试过以通常的方式在iframe中显示网站,如下所示:

<iframe name="I1" id="if1" width="100%" 
 height="254" style="visibility:visible" 
 src="http://www.google.com"></iframe>

google.com页面未在iframe中呈现,只是空白。到底是怎么回事?


为什么需要在iframe中显示Google?
保罗·艾伦·泰勒

不要引用我的意思,但是Google可能window.property会在IFrame中使用类似或类似的东西,从而破坏部分显示内容?
匿名显示2012年

如果您想使用Google搜索栏,请参见以下链接:google.com/webelements
#!/custom

@PaulAlanTaylor这是我客户的要求,据说他想在iframe中方便地在其网站上显示google结果。
Bala 2012年

11
只是这样做:<iframe src="https://www.google.com/webhp?igu=1"></iframe>
niutech

Answers:


117

原因是Google正在发送“ X-Frame-Options:SAMEORIGIN”响应标头。此选项可防止浏览器显示与父页面不在同一域中托管的iFrame。

请参阅:Mozilla开发人员网络-X-Frame-Options响应标头


18
我认为这是毫无用处的。如果有人能想到使用该功能的原因,除了刻薄之外,请随时告诉我。
匿名

15
@JonHanna并不能简单地与Google联系。
阿尔伯特

23
您可以在以下网址中使用此网址iframegoogle.com/search?
igu=1

1
或者,您可以使用我的X-Frame-Bypass Web组件。
niutech

4
@niutech令人难以置信的是,带有?igu = 1参数的URL可以正常工作。知道为什么吗?该选项的最初目的是什么?有趣的是,这使我显示为未登录,但是搜索字段仍然建议我进行一些实际的历史搜索。所以我“登录”了。很奇怪。
马克·汤姆森

28

这不是不可能的。
使用反向代理服务器来处理“不同来源问题”。我曾经使用Nginx与proxy_pass更改页面的网址。你可以试试看。

另一种方法是自己编写一个在服务器上运行的简单代理页面,只需从Google请求并将结果输出到客户端即可。


8
Google阻止了我尝试卷曲其标准搜索URL的简单尝试。:(我最终使用“ Google Custom”发送了不同的X-Frame-Options。google.com/custom?q=test&btnG=Search
Joel Mellon 2013年

7
是否有关于如何使用Nginx解决此问题的教程?
黑色

21

正如此处概述的那样,由于Google发送的是“ X-Frame-Options:SAMEORIGIN”响应标头,因此您不能简单地在iframe 中将src设置为“ http://www.google.com ”。

如果您想将Google嵌入到iframe中,则可以执行sudopeople在上面的评论中建议的操作,并使用如下所示的Google自定义搜索链接。这对我来说非常有效(将“ q =”留空以开始空白搜索)。

<iframe id="if1" width="100%" height="254" style="visibility:visible" src="http://www.google.com/custom?q=&btnG=Search"></iframe>

编辑:

此答案不再有效。有关信息以及有关如何用Google自定义搜索元素替换iframe搜索的说明,请访问:https : //support.google.com/customsearch/answer/2641279


蒂斯科蒂G!有没有添加图像结果的选项?
2014年

嘿Krzysztof Przygoda我想您可以使用src强制图像搜索,例如:http://www.google.com/search?site=imghp&tbm=isch&q='searchstring'但是因为它使用搜索?而不是自定义?你将无法在iframe中使用它
ScottyG

1
@ScottyG以上技术仍然有效吗?我尝试将该行放入空白页,即使我提供查询,我所得到的还是空白iframe
Andres

2
嗨安德烈斯,看来你可能是对的。我再也无法使它为我工作。现在,自定义搜索链接将重定向到google.ca/webhp?btnG=&gws_rd=ssl,这将强制使用ssl,并且现在似乎已在iframe中被阻止。我将继续对此进行调查,但看起来该党可能已经结束了……:(
ScottyG 2016年

8

您可以使用YQL绕过X-Frame-Options。

var iframe = document.getElementsByTagName('iframe')[0];
var url = iframe.src;
var getData = function (data) {
    if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content);
    else if (data && data.error && data.error.description) loadHTML(data.error.description);
    else loadHTML('Error: Cannot load ' + url);
};
var loadURL = function (src) {
    url = src;
    var script = document.createElement('script');
    script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData';
    document.body.appendChild(script);
};
var loadHTML = function (html) {
    iframe.src = 'about:blank';
    iframe.contentWindow.document.open();
    iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>'));
    iframe.contentWindow.document.close();
}

loadURL(iframe.src);
<iframe src="http://www.google.co.in" width="500" height="300"></iframe>

在这里运行:http : //jsfiddle.net/2gou4yen/

来自此处的代码:如何绕过X-Frame-Options:SAMEORIGIN HTTP标头?


3
它正在工作,但不是第一次。如果我打开嵌入的网页,则必须单击刷新才能首次加载页面。在那之后会很好。
Vivek Sinha

@ TV-C-15替换为时可以http://query.yahooapis.com使用https://query.yahooapis.com
niutech

在codepen [ codepen.io/anon/pen/Xyqqvb]上也进行了测试,并且在firefox,chrome,opera上可以正常工作(尽管有时需要刷新),如果我在本地复制并且打开浏览器,它在边缘BUT上不起作用 重新加载页面。这里是完整脚本:[ files.fm/u/arzrb2h4]

1
不工作。还有其他方法可以在iframe中打开Goog​​le吗?
克里希纳

3

您可以使用Google CSE(自定义Searche引擎)解决问题,该工具可以轻松插入iframe。您可以创建自己的搜索引擎,以搜索选定的网站,也可以在整个Google数据库中进行搜索。

可以根据需要设置结果的样式,也类似于Google样式。Google CSE可与网络和图片搜索一起使用。

google.php

<script>
  (function() {
    var cx = 'xxxxxxxxxxxxxxxxxxxxxx';
    var gcse = document.createElement('script');
    gcse.type = 'text/javascript';
    gcse.async = true;
    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(gcse, s);
  })();
</script>
<gcse:searchresults-only></gcse:searchresults-only>

yourpage.php

<iframe src="google.php?q=<?php echo urlencode('your query'); ?>"></iframe>

2

这样做之所以有效,是因为我使用它来使用自己的选项创建自定义Google搜索。Google对其进行了更改,并破坏了我的私人定制搜索页面:(以下不再有效。对于复杂的搜索模式非常有用。

<form method="get" action="http://www.google.com/search" target="main"><input name="q" value="" type="hidden"> <input name="q" size="40" maxlength="2000" value="" type="text">

网路

我猜更好的选择是只使用Curl或类似的东西。


1

它不是很理想,但是您可以使用代理服务器,并且工作正常。例如,转到www.google.com中的hidemyass.com,然后将其链接到iframe中就可以了!


0

如果您使用的是PHP,则可以file_get_contents()用来打印内容:

<?php
$page = file_get_contents('https://www.google.com');
echo $page;
?>

这将打印file_get_contents()此URL中获得的任何内容功能。请注意,由于您将内容显示为字符串而不是实际的网页,因此相对路径图像之类的内容无法正确显示,因为/img/myimg.jpg现在是从服务器而不是从google.com加载的。

但是,您可以使用一些技巧str_replace()来代替图像中的绝对URL,例如function:

<?php
$page = file_get_contents('https://www.google.com');
echo str_replace('src="img/','src="https://google.com/img/',$page);
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.