pushState
如果您需要搜索引擎来阅读内容,那是不好的吗?
不,讨论的重点pushState
是完成与hashbang相同的一般过程,但URL看起来更好。想一想当您使用hashbang时会发生什么...
你说:
借助hashbang,Google知道可以转到escaped_fragment URL来获取其静态内容。
换句话说,
- Google看到一个链接
example.com/#!/blog
- Google要求
example.com/?_escaped_fragment_=/blog
- 您返回用户应该看到的内容的快照
如您所见,它已经依赖于服务器。 如果您没有从服务器提供内容的快照,那么您的站点将无法正确索引。
那么Google如何用pushState看到任何东西?
使用pushState,google看不到任何内容,因为它无法使用javascript加载json并随后创建模板。
实际上,Google会在上显示其可以请求的任何内容site.com/blog
。URL仍然指向服务器上的资源,并且客户端仍然遵守此合同。当然,对于现代客户而言,JavaScript开辟了无需重新刷新页面即可检索内容并与之交互的新可能性,但是合同是相同的。
因此,的预期的优雅之处pushState
在于,它为所有新老用户(不支持JS)提供相同的内容,但是新用户获得了增强的体验。
您如何让Google查看您的内容?
Facebook方法–site.com/blog
在您推/blog
送到该状态时,在客户端应用程序将转换成的URL上提供相同的内容。(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,则视图源和重载都将获取内容。”)
并不是在客户端一次绘制用户界面并通过JS API加载内容是一个坏目标,这并不是因为它实际上并未使用HTTP和URL进行说明,而且基本上也不向后兼容。
目前,这正是hashbang的目的-表示在客户端而非服务器上导航的不同页面状态。例如,重新加载将加载相同的资源,该资源随后可以读取,解析和处理哈希值。
碰巧的是,它们也已被使用(尤其是Facebook和Twitter),以将历史记录更改为服务器端位置,而无需刷新页面。 人们建议在这些用例中为pushState放弃hashbang。
如果在客户端呈现所有内容,则应将其pushState
视为更方便的历史记录API的一部分,而不是摆脱使用hashbang的方法。