使用 PushState 和 Precomposition
当前(2015 年)执行此操作的方法是使用 JavaScript pushState 方法。
PushState 在不重新加载页面的情况下更改顶部浏览器栏中的 URL。假设您有一个包含选项卡的页面。选项卡隐藏和显示内容,并且内容是动态插入的,可以使用 AJAX 或通过简单地设置 display:none 和 display:block 来隐藏和显示正确的选项卡内容。
单击选项卡时,使用 pushState 更新地址栏中的 url。呈现页面时,使用地址栏中的值来确定要显示哪个选项卡。Angular 路由会自动为您执行此操作。
预合成
有两种方法可以访问 PushState 单页应用程序 (SPA)
- 通过 PushState,用户单击 PushState 链接,内容被 AJAX 处理。
- 通过直接点击 URL。
网站上的初始点击将涉及直接点击 URL。随着 PushState 更新 URL,随后的点击将简单地在内容中进行 AJAX。
爬虫从页面中获取链接,然后将它们添加到队列中以供以后处理。这意味着对于爬虫来说,服务器上的每次点击都是直接点击,它们不通过 Pushstate 导航。
Precomposition 将初始负载捆绑到来自服务器的第一个响应中,可能作为 JSON 对象。这允许搜索引擎在不执行 AJAX 调用的情况下呈现页面。
有一些证据表明 Google 可能不会执行 AJAX 请求。更多关于这里:
https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo
搜索引擎可以读取和执行 JavaScript
谷歌已经能够解析 JavaScript 有一段时间了,这就是他们最初开发 Chrome 的原因,作为谷歌蜘蛛的全功能无头浏览器。如果链接具有有效的 href 属性,则可以将新 URL 编入索引。没有什么可做的了。
如果单击链接另外触发了 pushState 调用,则用户可以通过 PushState 导航站点。
PushState URL 的搜索引擎支持
Google 和 Bing 目前支持 PushState。
谷歌
这是 Matt Cutts 对 Paul Irish 关于 PushState for SEO 的问题的回应:
http://youtu.be/yiAF9VdvRPw
以下是 Google 宣布对蜘蛛的全面 JavaScript 支持:
http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html
结果是 Google 支持 PushState 并将索引 PushState URL。
另请参阅 Google 网站管理员工具的 fetch as Googlebot。你会看到你的 JavaScript(包括 Angular)被执行了。
必应
以下是 Bing 于 2013 年 3 月宣布支持漂亮的 PushState URL:
http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/
不要使用 HashBangs #!
Hashbang url 是一个丑陋的权宜之计,要求开发人员在特殊位置提供网站的预渲染版本。它们仍然有效,但您不需要使用它们。
Hashbang URL 如下所示:
domain.com/#!path/to/resource
这将与这样的元标记配对:
<meta name="fragment" content="!">
Google 不会以这种形式将它们编入索引,而是会从 _escaped_fragments_ URL 中提取站点的静态版本并将其编入索引。
Pushstate URL 看起来像任何普通的 URL:
domain.com/path/to/resource
不同之处在于 Angular 通过拦截对在 JavaScript 中处理它的 document.location 的更改来为您处理它们。
如果您想使用 PushState URL(并且您可能会这样做),请删除所有旧的哈希样式 URL 和元标记,并在您的配置块中简单地启用 HTML5 模式。
测试您的网站
谷歌网站管理员工具现在包含一个工具,它允许您以谷歌的身份获取 URL,并在谷歌呈现它时呈现 JavaScript。
https://www.google.com/webmasters/tools/googlebot-fetch
在 Angular 中生成 PushState URL
要在 Angular 中生成真实的 URL,而不是带 # 前缀的 URL,请在 $locationProvider 对象上设置 HTML5 模式。
$locationProvider.html5Mode(true);
服务器端
由于您使用的是真实 URL,因此您需要确保服务器为所有有效 URL 提供相同的模板(加上一些预先组合的内容)。您如何执行此操作将根据您的服务器架构而有所不同。
网站地图
您的应用可能会使用不寻常的导航形式,例如悬停或滚动。为确保 Google 能够驱动您的应用,我可能会建议创建一个站点地图,即您的应用响应的所有 url 的简单列表。您可以将其放置在默认位置(/sitemap 或 /sitemap.xml),或使用网站管理员工具告诉 Google。
无论如何,拥有一个站点地图是个好主意。
浏览器支持
Pushstate 在 IE10 中工作。在旧版浏览器中,Angular 会自动回退到哈希样式的 URL
演示页面
以下内容使用带有预合成的 pushstate URL 呈现:
http://html5.gingerhost.com/london
可以验证,在此链接中,内容已编入索引并出现在 Google 中。
服务 404 和 301 标头状态代码
因为搜索引擎总是会针对每个请求访问您的服务器,所以您可以从您的服务器提供标头状态代码并期望 Google 看到它们。