Google bot通过HTML5模式路线在AngularJS网站上爬行

我们有一个使用HTML5路线的AngularJS网站。 我只是做了一些testing“抓取谷歌”运行。 结果有点混乱:

  • 在抓取选项卡上,我看到我们的网站,因为它看起来在视图源,所有的前端绑定{{}},而不是所有的HTML呈现
  • 在渲染选项卡上,我们的网站看起来非常好,没有{{}}variables,看起来像谷歌机器人抓取和渲染的网站,这也许是符合这个http://googlewebmastercentral.blogspot.ae/2014/ 05 /渲染页面与提取作为google.html 。

不过,我们已经准备好让Google无法抓取我们的网站,所以我们已经添加了,所以Google bot会以“?_escaped_fragment_ =”重新访问我们的网页,我们遵循https://developers.google.com / webmasters / ajax-crawling / docs / getting-started (“3.处理没有哈希碎片的页面”)在我们的Nginxconfiguration中,我们有这样的内容:

if ($args ~ "_escaped_fragment_=") { serve the static HTML snapshots } 

,如果我们自己传递_escaped_fragment_ =,它确实可以正常工作。 但是,Google机器人从未尝试使用此参数来抓取我们的网站,因此它从不抓取快照。 我们错过了什么吗? 我们是否也应该在我们的Nginx conf上添加Google bot的代理检测? 像这样的东西?

 if ($http_user_agent ~* "googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") { server from snapshots } 

如果我们能更好地理解这一点,那将是非常好的,非常感谢你!

更新:
我只是读了这个, http://scotch.io/tutorials/javascript/angularjs-seo-with-prerender-io?_escaped_fragment_=tag#caveats 。 所以,在使用手动工具(Google抓取)的时候,我们也应该把自己放在#! 或?_escaped_fragment_ =在正确的地方。 的确,如果我们传递了_escaped_fragment_ =,我们可以看到我们创build的HTML快照。

真的吗? 这是真的吗?

更新2在此主题的底部,Google员工validationGoogle网站pipe理员“Google抓取”需要手动传递_escaped_fragment_ =参数, https: //productforums.google.com/forum/#!msg /站长/ fZjdyjq0n98 / PZ-nlq_2RjcJ

干杯,
伊拿克里斯

我将尝试根据我们在上个月开发HTML5模式SPA的经验来回答您的问题。

如何让Googlebot使用?_escaped_fragment_ =而不是直接链接。

这其实很简单,但容易忽视。 实际上,有两种不同的方法可以让Googlebot试用escaped_fragment。 第一种方法是以非html5模式运行你的网站。 这意味着您的url将具有以下格式:

http://my.domain.com/base/#!some/path/on/website

Googlebot认可#! 并使用更改后的url对服务器进行第二次调用:

http://my.domain.com/base/?_escaped_fragment_=some/path/on/website

你可以随意处理。 让Googlebot尝试使用_escaped_fragment_模式的第二种方法是在您提供给机器人的索引页上包含以下元标记:

 <meta name="fragment" content="!"> 

这会让googlebot每次看到标签时都检查其他版本的网页。 有趣的是,你可以同时使用这两种技术,或者你可以做我们最终做的事情,这是用html标签的html5模式运行的。 这意味着您的url将被转义如下:

http://my.domain.com/base/some/path/on/website?_escaped_fragment_=

有趣的是,机器人不会把任何东西放在片段的末尾。 但是,根据您正在运行的Web服务器,您可以轻松地将匹配“_escaped_fragment_”文本的模式映射到备用bot页面。 有关转义片段的更多信息,请点击这里 。

“Googlebot抓取”返回我的页面的两个不同版本,{{}}的来源和呈现的页面看起来正确。 这意味着什么?

自2014年初以来,Google的机器人实际上可以对JavaScript进行有限的解释。有关更多信息,请在此处阅读谷歌网站pipe理员的官方博客条目。 然而,正如在博客文章中所表明的那样,这有很多警告。 例如:

  1. Googlebot不保证执行所有JavaScript代码。
  2. Googlebot会尝试在JavaScript中查找链接,并使用它们来帮助查找更多网页。
  3. Googlebot会通过执行尽可能多的javascript来呈现网站pipe理员工具中的预览(因此呈现的版本中缺less{{}}。
  4. Googlebot不一定会使用渲染的版本来build立关于您的网站索引的元信息。

截至2014年12月18日,我们仍然不确定Googlebot是否可以从呈现模式中为SPA索引提取任何信息,除了查找JavaScript中的链接。 根据我们的经验,Googlebot将在其索引列表中join{{},以便在您尝试使用{{}}填充元信息(描述,关键字,标题等等)时,您的网站在Googlesearch中看起来像这样结果:

{{meta.siteTitle}}
http://my.domain.com/base/some/path/on/website
{{meta.description}}

而不是你所期望的可能是这样的:


http://my.domain.com/base/some/path/on/website
这是我的网域上的随机页面。 一个很好的例子页面是肯定的!

GoogleBotsearch引擎使用_escaped_fragment_,但我们无法确定其他服务

Googlebuild议使用hashbang(#!)和_escaped_fragment_ param来提供AJAX网站的HTML快照。

但是,对于新的Googlefunction,所有Google服务通常都不支持。

就目前而言,根据经验,我们确信GoogleBot为索引网页使用HTML快照和_escaped_fragment_。 您可以检查您的服务器访问日志,以确保Google在您的应用程序上做到了。

(现在和经验,没有官方的谷歌)其他服务,如PageSpeed Insight,网站pipe理员工具分析器,Richsnippettesting工具等:hasbang(#!)不支持。 你必须使用_escaped_fragment_。

你应该使用用户代理检测来提供HTML快照吗?

不,不, 由于不同的原因:

  1. 你只是不知道networking上的哪些服务/机器人想分析你的内容,你不能穷尽(例如,想想networking上存在的所有社交networking使用Bot来创build你的内容的片段:你可以不一一处理)
  2. 这可以认为是cloacking:服务不同的版本取决于在同一个URL的用户types,这基本上是错误的search引擎优化。

Google寻找#! 在我们的网站url,然后采取一切#后! 并将其添加到_escaped_fragment_查询参数中。 一些开发人员使用真实数据创build基本的html页面,并在爬网时从服务器端提供这些页面。 那么,为什么我们不能在服务端渲染与_escaped_fragment_相同的页面。 欲了解更多详情,请阅读这个博客 。

也许有点过时,但为了完整性:

根据2014年5月23日发布的声明, Google机器人现在能够“更像现代Web浏览器一样查看您的内容”。

根据他们2015年10月14日的声明, Google不赞成使用AJAX抓取scheme。

因此,使用HTML5 History API(html5mode in angular)对Google来说应该不成问题。