pushState和SEO

| 许多人一直在说,使用pushState而不是hashbang。 我不明白的是,如果不使用hashbang,您将如何对搜索引擎友好? 大概您的pushState内容是由客户端JavaScript代码生成的。 因此,场景是: 我在
example.com
。我的用户点击了一个链接:
href=\"example.com/blog\"
pushState捕获点击,更新URL,从某处获取JSON文件,并在内容区域中创建博客文章列表。 借助hashbang,Google知道转到escaped_fragment URL以获得其静态内容。 使用pushState,Google看不到任何东西,因为它无法使用JavaScript代码加载JSON并随后创建模板。 我看到的唯一方法是在服务器端渲染模板,但这完全抵消了将应用程序层推送到客户端的好处。 那么,我是否正确,pushState根本不适合客户端应用程序进行SEO友好?     
已邀请:
        如果使用Google为那些不希望其网址中出现乱七八糟的人建议的meta标签,该怎么办:
<meta name=\"fragment\" content=\"!\">
请参阅此处以获取更多信息: https://developers.google.com/webmasters/ajax-crawling/docs/getting-started 不幸的是,我认为Nicole并没有澄清我认为OP存在的问题。问题是,如果不使用哈希爆炸,我们将不知道向谁提供内容。 Pushstate不能为我们解决这个问题。我们不希望搜索引擎告诉最终用户导航到一些会吐出未格式化JSON的URL。取而代之的是,我们创建URL(触发对更多URL的其他调用),这些URL通过AJAX检索数据并将其以我们喜欢的方式呈现给用户。如果用户不是人类,那么我们可以提供html快照作为替代,以便搜索引擎可以正确地将人类用户定向到他们希望在URL上找到的网址(并以可呈现的方式)。但是最终的挑战是我们如何确定用户类型?是的,我们可以使用.htaccess或其他方式重写检测到的搜索引擎机器人的URL,但是我不确定这是多么全面和可靠。 Google可能还会因为这样做而对人进行惩罚,但我尚未对其进行全面研究。因此(pushstate + google \的meta标记)组合似乎是一种可能的解决方案。     
如果您需要搜索引擎来阅读内容,ѭ3不好吗? 不,关于ѭ3的讨论旨在实现与hashbang相同的通用过程,但URL看起来更好。想想当您使用hashbangs时会发生什么... 你说:   借助hashbang,Google知道可以转到escaped_fragment URL来获取其静态内容。 换句话说, Google看到了指向“ѭ5”的链接 Google要求
example.com/?_escaped_fragment_=/blog
您返回用户应该看到的内容的快照 如您所见,它已经依赖于服务器。如果您没有从服务器提供内容的快照,则说明您的网站没有正确索引。 那么Google如何用pushState看到任何东西?   使用pushState,google看不到任何内容,因为它无法使用javascript加载json并随后创建模板。 实际上,Google会以7英镑的价格看到它可以要求的任何内容。 URL仍指向服务器上的资源,并且客户端仍遵守此合同。当然,对于现代客户而言,JavaScript开辟了无需重新刷新页面即可检索内容并与之交互的新可能性,但是合同是相同的。 因此,“ 3”的初衷是为所有新老用户提供相同的内容,而不支持JS,但是新用户获得了增强的体验。 您如何让Google查看您的内容? Facebook方法–在URL
site.com/blog
上提供相同的内容,当您将
/blog
推入状态时,客户端应用程序将转换为该内容。 (Facebook尚不使用我所知道的ѭ3,,但他们使用hashbang来做到这一点) Twitter方法-将所有传入URL重定向到等效的hashbang。换句话说,到\“ / blog \”的链接将
/blog
推送到状态上。但是如果直接请求,浏览器将以
#!/blog
结尾。 (对于Googlebot,您可以根据需要将其路由到ѭ14。对于其他客户端,您可以将ѭ3返回到漂亮的网址)。 那么,您会失去
pushState
_escaped_fragment_
能力吗? 在几个不同的评论中,您说   转义的片段是完全不同的。您可以提供纯非主题的内容,缓存的内容,而不用承受普通页面的负担。      对于Google而言,理想的解决方案是要么执行JavaScript网站,要么实施某种方式来知道即使对于pushstate网站(robots.txt?)也存在转义的片段URL。 您提到的好处并不仅限于
_escaped_fragment_
。它为您进行重写并使用特殊命名的
GET
参数确实是实现细节。使用标准URL可以做的事情没有什么特别的,换句话说,您可以使用mod_rewrite或服务器等效的文件将
/blog
重写为
/?content=/blog
。 如果您根本不提供服务器端内容怎么办? 如果您无法以10英镑(或您推送到浏览器的任何状态)重写URL并提供某种内容,那么您的服务器实际上不再遵守HTTP协议。 这很重要,因为页面重新加载(无论出于何种原因)都会在此URL提取内容。 (请参阅https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review-\“查看源和重新加载都将在新URI推送内容的同时获取内容。”) 并不是在客户端一次绘制用户界面并通过JS API加载内容是一个坏目标,它并不是真正使用HTTP和URL来解决的,而且基本上也不是向后兼容。 目前,这正是hashbang的目的-表示在客户端而非服务器上导航的不同页面状态。例如,重新加载将加载相同的资源,该资源随后可以读取,解析和处理哈希值。 碰巧的是,它们也已被使用(特别是Facebook和Twitter),以将历史记录更改为服务器端位置,而无需刷新页面。人们建议在这些用例中为pushState放弃hashbang。 如果在客户端呈现所有内容,则应将ѭ3视为更方便的历史记录API的一部分,而不是摆脱使用hashbang的方法。     
关于pushState和
#!
的所有有趣的话题,我仍然看不到pushState如何替换原始海报要求的#!\的目的。 当然,使我们的99%基于JavaScript的Ajax网站/应用程序SEOable的解决方案是使用
#!
。由于客户端渲染是通过HTML,JavaScript和PHP完成的,因此我们在页面登陆控制的加载器中使用以下逻辑。 HTML文件与JavaScript和PHP完全分开,因为我们希望两者都使用相同的HTML(大部分情况下)。 JavaScript和PHP的作用大致相同,但是由于JavaScript具有更丰富的用户体验,因此PHP代码不那么复杂。 JavaScript使用jQuery将所需的内容注入HTML。 PHP使用PHPQuery将所需的内容注入HTML-使用\'almost \'相同的逻辑,但比PHP版本简单得多,它将仅用于显示具有SEOable链接的SEOable版本,而不会像JavaScript那样进行交互版。 所有这些都是构成页面的三个组件,page.htm,page.js和page.php对于使用转义的片段来知道是否加载PHP版本来代替JavaScript版本的任何内容而言都是存在的。非SEOable内容(例如,只有在用户登录后才能看到的页面)不需要存在PHP版本。一切都很简单。 我仍然很困惑,一些前端开发人员如何在不将服务器端技术与浏览器技术结合使用的情况下,开发出色的网站(凭借Google Docs的丰富性)……如果甚至没有启用JavaScript,那么我们99%的JavaScript如果没有适当的PHP,该解决方案当然不会做任何事情。 如果启用了JavaScript,可能有一个不错的URL可以登陆到PHP服务的页面上并重定向到JavaScript版本,但是从用户的角度来看,这并不是很好,因为用户是更重要的受众。 附带说明。如果您只是制作一个无需任何JavaScript即可运行的简单网站,那么如果您希望逐步将用户体验从简单的静态呈现内容逐步改善为更好的东西,但是如果您想为用户提供最好的体验……假设您使用JavaScript或Google Docs之类的工具编写了最新游戏,那么此解决方案的使用就受到限制,因为优雅地回退只能在用户体验之前走得很远与网站的愿景相比,这是很痛苦的。     

要回复问题请先登录注册