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