索引 angularjs 应用程序 - Googlebot 模拟与 site:domain

Indexing angularjs app - Googlebot-simulation vs site:domain

我最近使用 Angularjs 创建了一个网页,我目前正在尝试使用 pushstate 将其编入索引 Google。

我做了相当多的研究,发现我可以在 Google Webmaster tools 中使用 Googlebot-simulater 来模拟对我网站的 Google 访问,看看机器人如何查看我的网页与用户看到的内容。

这里的结果看起来不错,Google 看到的东西和我的用户完全一样,所有 pages/subpages 的状态都是 partiallyfully

我今天早上得知要查看 Google 在我的网站上看到的内容的另一种方式是通过谷歌搜索 site:domainname。这是所有 pages/subpages Google 具有 cached 的列表,通过单击不同的链接,您可以看到显示相应页面的视图。

这是我是否有点担心自己错过了什么,因为无论 partially/fully 状态如何,当我查看我的页面时,我的页面来自 Goolgebot-simulation页面(使用第二种方法),页面都是空白的。

这是我第一次索引网页,我已经尝试了几天,但没有任何运气。有没有人可以告诉我我在做什么 wrong/missin,或者至少指出正确的方向?还是我应该再耐心一点?

一些信息:

pushstate 与索引您的页面无关;它只是在那里操纵浏览器历史记录,模拟 URI 更改,而实际上 SPA(单页应用程序又名。您的 Angular 应用程序)在内部路由而不重新加载页面。 (Angular 也称之为 HTML5 模式)

Javascript 和 Googlebot:

虽然 google-bot(或任何其他搜索爬虫)基本上只是一个无头浏览器,没有 运行 您的页面 JavaScript 代码的功能,但它不会看到动态生成的内容。

为了索引 SPA 并将动态内容传送给爬虫,您需要提供动态生成页面的静态 HTML 快照并将其提供给机器人。

如果您不使用静态 HTML 快照,google 机器人看到的唯一东西就是

<html>
<body>

<div ui-view="mainContent"></div>

</body>

更多信息: https://support.google.com/webmasters/answer/174992?hl=en

为了生成这些快照,您可以使用多种 SPA 索引服务之一,例如 https://prerender.io/(如果您自己托管则免费;或付费托管版本)。他们所做的是启动带有 JS-Support (phantomjs) 的浏览器,然后打开所有提供的 URL(通过静态列表、爬行、sitemap.xml ...)运行 页面上的所有 JavaScript 代码,等待页面完成(通过超时或您必须触发的特定事件),然后保存页面的静态版本(=快照)。

为了确保机器人找到那些你必须处理的快照并提供 escaped_fragment ,默认情况下它是 # 或者你用 <meta name="fragment" content="!"> 覆盖它,如果 # 已经在其中使用你的申请。

如果你使用prerender.io提供的中间件(我和项目无关,只是用它)很多难的东西已经解决了。

这里有更多信息:https://developers.google.com/webmasters/ajax-crawling/docs/specification?hl=en

Johannes Ferner 的回答不正确。过去是这样,Google 更新他们的文档真的很慢,但他们已经正式宣布他们确实可以处理 AJAX 页面而不需要 HTML 快照,只要你是使用推送状态。 Bing 已跟进并处理推送状态。

例如,搜索 site:yoamoseguros.com 并检查那里的缓存结果。该页面是在 Angular 中构建的,使用 AJAX 和 pushstates 完全加载,显示和索引都很好。

并忽略损坏的页面,几天前我做了一个失败的部署,完全损坏的重定向把一切都搞砸了,Google 在我有机会删除之前有时间索引损坏的页面他们。有一次他们快速索引了我的东西... :/


因此,如果您正在使用 pushstates(html5 模式开启)并且您的页面未被 Google 正确显示,那么还有其他事情正在发生。检查您的 robots.txt,您是否阻止 Google 读取 js 文件或图像等静态内容?它需要访问这样的文件才能正确索引页面。

此外,请确保您的片段只是“#”而不是“#!”。在后一种情况下,Google 将假定您要使用 html 快照并尝试找到它们,但可能会失败。因此,如果您想使用更简单的 pushstate 版本,请确保您没有使用“#!”。


最后一点,Facebook 支持推送状态。所以 Facebook 仍然需要快照(或者只是 index.html 中的硬编码 og 标签,具体取决于您拥有的内容类型)。