如何在服务器端呈现iframe内部内容,用于SEO
ReactJS - How to render iframe inner contents server-side, for SEO?
我正在开发一个使用Facebook的React JS框架支持客户端和服务器端渲染的应用程序。
我需要渲染一个iframe,它里面有一些html。HTML是使用我可以访问的脚本创建的。
但是,我希望内部内容在服务器上呈现,以便HTML显示在搜索引擎中。问题是,要创建内部内容,通常需要等待iframe"加载",这不会发生在服务器上。
我该怎么做?
这是我尝试过的,但没有成功:
render: function() {
return (
<div>
<iframe
ref="myIframe">
</iframe>
</div>
);
},
componentDidMount : function() {
var iFrameNode = this.refs.myIframe,
frameDoc = iFrameNode.contentWindow.document;
frameDoc.write('<html><body style="margin:0px;"><div><script type="text/javascript" src="..."></script></div> ... more html');
}
请注意,我在componentDidMount上添加内容,否则当iframe加载时,它会被"擦除"。
一个很好的方法是使用数据URI模式。它允许通过src属性向iframe插入html内容。目前支持除IE以外的所有浏览器(部分支持-没有html选项)- caniuse.
这将允许谷歌搜索引擎读取服务器端iframe的内容。
所以你的代码应该是-render: function() {
var frameSrc = browser.ie ? '' : 'data:text/html,<html><body style="margin:0px;">...more html">'
return (
<div>
<iframe
ref="myIframe"
src="{frameSrc}"
</iframe>
</div>
);
},
componentDidMount : function() {
if (browser.ie) { //some browser detection library/code
var iFrameNode = this.refs.myIframe,
frameDoc = iFrameNode.contentWindow.document;
frameDoc.write('<html><body style="margin:0px;"><div><script type="text/javascript" src="..."></script></div> ... more html');
}
}
iframe有时用于在网页上显示内容。内容通过iframe显示的内容可能无法被索引,无法显示谷歌的搜索结果。我们建议您避免使用iframe显示内容。如果你确实包含了iframe,请确保为它们显示的内容提供额外的基于文本的链接谷歌机器人可以抓取和索引这些内容。
- Google网站管理员指南
所以从SEO的角度来看,你要么需要停止在这里使用iframe,要么接受它不会被索引。
聪明的技巧,比如把它放在html中,然后切换到iframe不会有帮助,因为Googlebot使用JavaScript…除非您使用useragent嗅探来发送空JavaScript文件,但我不建议这样做。
直接的答案是使用__dangerlysetinnerhtml如果!this.state.x
,并在componentDidMount setTimeout(() => this.setState({x: true}), 0)
,并注入html到组件diduupdate的iframe
有一个React组件来渲染iframes: https://github.com/svenanders/react-iframe
你可以用npm install react-iframe
得到它,然后在你的React代码中像这样使用它:
import React from 'react';
import Iframe from 'react-iframe';
...
// In your render function:
<Iframe url="whatever.html" />
对我来说不幸的是,我实际上更喜欢将我的服务器生成的HTML呈现为<div>
而不是实际的<iframe>
…
- 将函数的上下文应用于javascript变量
- keyup事件处理程序更改焦点不适用于快速键入
- JQueryhide()不适用于Mozzilla,但适用于Chrome
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- PHP中的setcookie仅适用于localhost
- 包括用于facebook评论框的JavaScript SDK
- 如何检测用于WebGL的专用或集成显卡
- ng更改事件不适用于Dropdown
- 用于搜索的聚合物嵌套绑定
- jQuery表单添加不适用于下拉列表
- Rails/JSON:如何将JSON用于jquery UI自动完成表单
- JS编译器/包管理器,用于版本控制
- 将CSS应用于printWindow.print();在Javascript中
- 用于'魔术串'属性
- 用于检查数组中是否存在元素的javascript自定义方法
- 在用于SEO的Marionette应用程序中使用推送状态
- 从Javascript生成HTML文件用于SEO
- .htaccess用于SEO机器人在没有哈希标签的情况下抓取单页应用程序
- 如何在服务器端呈现iframe内部内容,用于SEO
- 如何使用JavaScript &.htaccess用于SEO