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