如果您需要搜索引擎来阅读您的内容,pushState 是否不好?
不,关于pushState 的讨论旨在完成与 hashbangs 相同的一般过程,但 URL 更好看。想想当你使用 hashbang 时会发生什么……
你说:
借助 hashbang,Google 知道要转到 escaped_fragment URL 以获取其静态内容。
也就是说,
- Google 看到了指向
example.com/#!/blog 的链接
- 谷歌请求
example.com/?_escaped_fragment_=/blog
- 你return a snapshot of the content the user should see
如您所见,它已经依赖于服务器。 如果您没有提供来自服务器的内容快照,则说明您的网站没有被正确编入索引。
那么 Google 将如何看待 pushState 的内容?
使用 pushState,google 什么也看不到,因为它无法使用 javascript 加载 json 并随后创建模板。
实际上,Google 会在site.com/blog 看到它可以请求的任何内容。 URL 仍然指向服务器上的资源,客户端仍然遵守这个约定。当然,对于现代客户来说,Javascript 为检索内容和与内容交互提供了新的可能性,而无需 页面 刷新,但合同是相同的。
所以pushState 的预期优雅之处在于它为所有用户提供相同的内容,新老用户,支持 JS 的用户和不支持 JS 的用户,但新用户 get an enhanced experience。
如何让 Google 看到您的内容?
Facebook 方法 — 在 URL site.com/blog 上提供相同的内容,当您将 /blog 推送到状态时,您的客户端应用程序将转换为该内容。 (据我所知,Facebook 尚未使用 pushState,但他们使用 hashbangs 来做到这一点)
Twitter 方法 - 将所有传入 URL 重定向到等效的 hashbang。换句话说,指向“/blog”的链接将/blog 推送到状态。但如果直接请求,浏览器会以#!/blog 结束。 (对于 Googlebot,这将根据需要路由到 _escaped_fragment_。对于其他客户端,您可以将 pushState 返回到漂亮的 URL)。
那么您是否会因pushState 而失去_escaped_fragment_ 功能?
在几个不同的 cmets 中,你说
转义片段完全不同。您可以提供纯非主题内容、缓存内容,而不会像普通页面那样承受负载。
理想的解决方案是 Google 要么创建 JavaScript 网站,要么实施某种方式来了解即使对于 pushstate 网站(robots.txt?)也存在转义片段 URL。
您提到的好处并不局限于_escaped_fragment_。它为您进行重写并使用特别命名的GET 参数实际上是一个实现细节。没有什么特别之处是您无法使用标准 URL 实现的 - 换句话说,您可以使用 mod_rewrite 或您的服务器的等效项自行将 /blog 重写为 /?content=/blog。
如果您根本不提供服务器端内容怎么办?
如果您无法重写 URL 并在/blog(或您推送到浏览器中的任何状态)提供某种内容,那么您的服务器实际上不再遵守 HTTP 合同.
这很重要,因为页面重新加载(无论出于何种原因)都会在此 URL 处提取内容。 (请参阅https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review —“如果推送了新 URI,则查看源和重新加载都将获取新 URI 的内容。”)
在客户端绘制用户界面并通过 JS API 加载内容并不是一个糟糕的目标,只是它没有真正考虑到 HTTP 和 URL,而且它基本上不向后兼容。
目前,这正是 hashbang 的用途——表示在客户端而非服务器上导航的不同页面状态。例如,重新加载将加载 same 资源,然后该资源可以读取、解析和处理散列值。
碰巧它们也被(特别是 Facebook 和 Twitter)用于将历史记录更改为服务器端位置,而无需刷新页面。 正是在这些用例中,人们建议为 pushState 放弃 hashbang。
如果您在客户端呈现所有内容,您应该将pushState 视为更方便的历史 API 的一部分,而不是使用 hashbangs 的出路。