简短回答 - 不,html5mode 不会弄乱您的索引,但请继续阅读。
重要提示:Google 和 Bing 都可以在没有 HTML 快照的情况下抓取基于 AJAX 的内容
我知道,您链接到的文档另有说明,但大约一两年前,他们正式宣布他们处理 AJAX 内容无需只要您使用 pushstates,就不需要 HTML 快照,但是很多文档都很旧,很遗憾没有更新。
使用推送状态的 SEO
开箱即用的 AJAX 抓取要求是您正在使用 pushstates 更改您的 url。这正是 Angular 中的 html5mode 所做的(以及许多其他框架所做的)。当 pushstates 处于打开状态时,爬虫将等待 ajax 调用完成并等待 javascript 在索引页面之前更新页面。您甚至可以更新路由器中的页面标题甚至元标记等内容,它会正确索引。本质上你不需要做任何事情,在这种情况下,服务器端和客户端呈现的站点之间没有区别。
需要明确的是,许多 SEO 分析工具(例如 Moz)会在使用 pushstates 的页面上发出警告。这是因为这些工具(如果您与他们交谈,他们的代表)在撰写本文时还不是最新的,所以请忽略它们。
最后,请确保您在执行此操作时不使用下面的片段元标记。如果你有那个标签,爬虫会认为你想使用非pushstates方法,事情可能会搞砸。
没有推送状态的 SEO
几乎没有理由不使用 Angular 的 pushstates,但如果您不使用,则需要遵循问题中链接的指南。简而言之,您在服务器上创建 html 的快照,然后使用片段元标记将您的 url-fragment 更改为“#!”而不是“#”。
<meta name="fragment" content="!" />
当爬虫找到这样的页面时,它将删除 url 的片段部分,而是使用参数 _escaped_fragment_ 请求 url,并且您可以提供快照页面作为响应。给爬虫一个普通的静态页面来索引。
请注意,仅当您想触发此行为时才应使用片段元标记。如果您正在使用 pushstates 并希望页面以这种方式索引,请不要使用此标记。
此外,在 Angular 中使用快照时,您可以开启 html5mode。在 html5mode 中,片段被隐藏,但在技术上它仍然存在,并且仍然会触发相同的行为,假设片段元标记已设置。
警告 - Facebook 爬虫
虽然 Google 和 Bing 都会毫无问题地抓取您的 AJAX 页面(如果您使用的是 pushstates),但 Facebook 不会。 Facebook 不理解 ajax-content,仍然需要特殊的解决方案,例如专门为 facebook bot 提供的 html 快照(用户代理 facebookexternalhit/1.1)。
编辑 - 我应该提到我已经部署了所有这些版本的网站。两者都有 html5mode、片段元标记和快照,没有任何快照,只依赖于 pushstate-crawling。除了上面提到的 pushstates 和 Facebook 之外,一切都很好。