pushState
如果您需要搜索引擎来阅读您的内容,这很糟糕吗?
不,所讨论的pushState
是完成与 hashbangs 相同的一般过程,但具有更好看的 URL。想想当你使用 hashbangs 时会发生什么......
你说:
使用 hashbangs,谷歌知道去escaped_fragment URL 来获取它们的静态内容。
所以换句话说,
- 谷歌看到一个链接
example.com/#!/blog
- 谷歌请求
example.com/?_escaped_fragment_=/blog
- 您返回用户应该看到的内容的快照
如您所见,它已经依赖于服务器。 如果您没有提供来自服务器的内容快照,那么您的网站就没有被正确编入索引。
那么谷歌将如何看待 pushState 的任何事情呢?
使用 pushState,谷歌什么也看不到,因为它不能使用 javascript 加载 json 并随后创建模板。
实际上,Google 会在site.com/blog
. URL 仍然指向服务器上的资源,客户端仍然遵守这个约定。当然,对于现代客户而言,Javascript 开辟了无需刷新页面即可检索内容和与内容交互的新可能性,但契约是相同的。
因此, 预期的优雅pushState
是它为所有用户提供相同的内容,无论是新老用户,支持 JS 还是不支持,但新用户获得增强的体验。
你如何让谷歌看到你的内容?
Facebook 方法——在 URLsite.com/blog
上提供相同的内容,当您推/blog
送到状态时,您的客户端应用程序将转换为该 URL 。(据pushState
我所知,Facebook 还没有使用,但他们用 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,view-source 和 reload 都将从新 URI 获取内容。”)
并不是说在客户端绘制一次用户界面并通过 JS API 加载内容是一个糟糕的目标,只是它并没有真正考虑到 HTTP 和 URL,并且它基本上不向后兼容。
目前,这正是 hashbangs 的目的——代表在客户端而不是服务器上导航的不同页面状态。例如,重新加载将加载相同的资源,然后该资源可以读取、解析和处理散列值。
碰巧的是,它们也被用于(尤其是 Facebook 和 Twitter)将历史更改为服务器端位置,而无需刷新页面。 正是在这些用例中,人们建议为 pushState 放弃 hashbangs。
如果您在客户端呈现所有内容,您应该将其pushState
视为更方便的历史 API 的一部分,而不是使用 hashbangs 的方法。