我们有一个使用HTML5路线的AngularJS网站 . 我刚做了一些测试“Fetch as Google”运行 . 结果有点令人困惑:
-
在提取选项卡上,我看到我们的网站在视图源上查看,包含所有前端绑定{{}},而不是所有呈现的HTML
-
在渲染选项卡上,我们的网站看起来非常精细,没有{{}}个变量,看起来像谷歌机器人获取并使网站正常,这可能与此一致,http://googlewebmastercentral.blogspot.ae/2014/05/rendering-pages-with-fetch-as-google.html .
但是,我们已经准备好Google无法抓取我们的网站了,所以我们已经添加了,所以Google僵尸程序用“?escaped_fragment =”重新访问我们的页面 . 我们按照这个,https://developers.google.com/webmasters/ajax-crawling/docs/getting-started(第"3. Handle pages without hash fragments"节) . 在我们的Nginx中配置我们有这样的事情:
if ($args ~ "_escaped_fragment_=") {
serve the static HTML snapshots
}
,如果我们传递_escaped_fragment_ =我们自己,它确实工作正常 . 但是,Google僵尸程序从未尝试使用此参数抓取我们的网站,因此它从不抓取快照 . 我们错过了什么吗?我们是否还应该在我们的Nginx配置中为Google bot添加代理检测功能?像这样的东西?
if ($http_user_agent ~* "googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") {
server from snapshots
}
如果我们能够更好地理解这一点会很棒,非常感谢你!
UPDATE:
我刚读过这个,http://scotch.io/tutorials/javascript/angularjs-seo-with-prerender-io?escaped_fragment=tag#caveats . 因此,似乎在使用手动工具(Fetch as Google)时,我们应该自己通过#!或?escaped_fragment =在正确的地方 . 实际上,如果我在我们的案例中传递了?escaped_fragment =,我确实看到了我们创建的HTML快照 .
真的吗?这是如何工作的吗?
UPDATE 2 在此主题的底部,Google员工会验证对于Google网站管理员"Fetch as Google",您需要自己手动传递_escaped_fragment_ =参数,https://productforums.google.com/forum/#!msg/webmasters/fZjdyjq0n98/PZ-nlq_2RjcJ
干杯,
伊拿克里斯
4 回答
也许有点过时,但为了完整性:
根据statement from May 23, 2014谷歌机器人现在能够"see your content more like modern Web browsers" .
根据他们的statement from October 14, 2015谷歌弃用了AJAX抓取方案 .
因此,使用HTML5历史记录API(角度为html5mode)应该对Google没有问题 .
我将根据我们在上个月开发使用HTML5模式的SPA的经验来回答您的问题 .
如何使用Googlebot?escaped_fragment =而不是直接链接 .
这实际上非常简单但容易被忽视 . 实际上,有两种不同的方法可以让Googlebot尝试使用escaped_fragment . 第一种方法是以非html5模式运行您的站点 . 这意味着您的网址将采用以下格式:
Googlebot认可#!并使用更改的URL对您的服务器进行第二次调用:
然后您可以按照自己的意愿处理 . 让Googlebot尝试_escaped_fragment_模式的第二种方法是在您提供给bot的索引页面上包含以下元标记:
这将使googlebot每次看到标记时都会检查网页的其他版本 . 有趣的是,您可以将这两种技术结合使用,或者您可以执行我们最终要做的事情,即使用元标记在html5模式下运行 . 这意味着您的网址将按如下方式进行转义:
有趣的是,机器人不会在片段的末尾添加任何内容 . 但是,根据您运行的Web服务器,您可以使用与"escaped_fragment"文本匹配的模式轻松地将其映射到备用bot页面 . 有关转义片段的更多信息,请转到here .
“以Googlebot格式获取”会返回我的页面的两个不同版本,源代码为{{}},呈现的页面看起来正确 . 那是什么意思?
自2014年初以来,Google的Bots实际上可以在一定程度上解释JavaScript . 有关更多信息,请阅读google网站管理员here上的官方博客条目 . 但是,正如在博客文章中明确指出的那样,这有很多警告 . 例如:
Googlebot不保证能够执行所有javascript代码 .
Googlebot会尝试在javascript中查找要关注的链接,并使用它们来帮助查找更多网页 .
Googlebot将通过尽可能多地执行javascript来渲染网站管理员工具中的预览(因此在渲染版本中缺少{{}}) .
Googlebot不一定会使用呈现的版本来为您的索引构建有关您网站的元信息 .
截至 18/12/2014 ,我们仍然不确定Googlebot是否可以在渲染模式下从SPA中实际提取任何信息以获取其索引,而不是在javascript中查找要遵循的链接 . 根据我们的经验,Googlebot会在其索引列表中包含{{}},这样当您尝试使用{{}}填充元信息(说明,关键字, Headers 等)时,您的网站就会像这在谷歌搜索结果中:
而不是你期望的可能是这样的:
GoogleBot for Search Engine使用_escaped_fragment_但我们无法确定其他服务
Google建议使用hashbang(#!)和_escaped_fragment_ param来提供AJAX网站的HTML快照 .
但是,对于新的谷歌功能而言,所有谷歌服务都不支持它 .
目前,根据经验,我们确信GoogleBot索引网页使用HTML快照和_escaped_fragment_ . 您可以检查服务器访问日志,以确保Google在您的应用程序上执行此操作 .
(目前和经验,谷歌没有官方提供)其他服务,如PageSpeed Insight,网站管理员工具解析器,Richsnippet测试工具等:hasbang(#!)不受支持 . 你必须使用_escaped_fragment_ .
您是否应该使用User Agent检测来提供HTML快照?
不,只是不要 . 出于不同的原因:
您只是不知道网络上哪些服务/机器人想要解析您的内容而您无法详尽无遗(例如,想想使用Bot在网络上存在的所有社交网络来创建您的内容片段:您不能一个一个地处理它们)
这可以被视为cloacking:根据同一URL上的用户类型提供不同的版本,这对于SEO来说基本上是错误的 .
Google在我们的网站网址中查找 #! ,然后在 #! 之后获取所有内容并将其添加到 escaped_fragment 查询参数中 . 一些开发人员使用真实数据创建基本的html页面,并在爬行时从服务器端提供这些页面 . 那么,为什么不在 escaped_fragment 的服务方面使用 PhantomJS 渲染相同的页面 . 有关详细信息,请阅读blog .