2011-01-25 53 views
2

我有一个页面在我的网站上有一个经常更新的东西的列表。这个列表是通过jsonp调用服务器创建的,获取json并将其转换为html。快速和光滑。谷歌搜索优化阿贾克斯调用

不幸的是,Google无法为其编制索引。根据Google's AJAX crawling guide阅读完后,我有点困惑,需要一些澄清和确认:

ajax页面只需要执行规则,对吧? 我现在有一个休息的url像

[site]/base/junkets/browse.aspx?page=1&rows=18&sidx=ScoreAll&sord=desc&callback=jsonp1295964163067 

这将需要成为类似:

[site]/base/junkets/browse.aspx#page=1&rows=18&sidx=ScoreAll&sord=desc&callback=jsonp1295964163067 

而当谷歌称它像这样

[site]/base/junkets/browse.aspx#!page=1&rows=18&sidx=ScoreAll&sord=desc&callback=jsonp1295964163067 

我将不得不交付html快照。

为什么要更换?用#? 创建html快照看起来非常麻烦。仅仅提供简单的链接就足够了吗?在我的情况下,我会很高兴,如果谷歌只索引的东西页面。

回答

4

它看起来像你误解了AJAX检索指南。该#!符号被链接上使用的 Ajax应用程序内的生活,而不是你的机应用将调用该服务的URL例如,如果我前往example.com/app/访问你的应用程序,那么你会通过,而不是链接到example.com/app/#!page=1使抓取页面。

现在,当Googlebot看到该URL的链接,而不是去example.com/app/#!page=1 –这意味着发行请求example.com/app/(回想一下散列从未发送到服务器)–它将请求example.com/app/?_escaped_fragment_=page=1。如果请求中存在_escaped_fragment_,则知道返回内容的静态HTML版本。

为什么所有这些都是必需的? Googlebot不会执行脚本(也不知道如何索引您的JSON对象),所以在脚本运行和内容加载后,您无法知道在用户面前会发生什么。所以,你的服务器必须为你的用户最终在AJAXy版本中看到的产生一个HTML版本。

那么你的下一步是什么?

首先,要么改变指向您的应用程序的链接,包括#!page=1(或其他),或添加<meta name="fragment" content="!">到您的应用程序的HTML。 (见AJAX crawling guide的第3项。)

当用户更改页面时(如果适用),您还应该更新散列以反映当前页面。你可以简单地设置location.hash='#!page=n';,但我建议使用优秀的jQuery BBQ plugin来帮助你管理页面的散列。 (这样,如果用户在地址栏中手动更改哈希,您可以监听哈希的更改。)警告:当前发布的BBQ(1.2.1)版本不支持AJAX可抓取的URL,但最新版本Git master(1.3pre)会,所以你需要grab it here。然后,只需设置AJAX抓取选项:

$.param.fragment.ajaxCrawlable(true); 

,你就会有一些服务器端逻辑添加到example.com/app/检测的_escaped_fragment_在查询字符串的存在,并返回一个静态的HTML版本的页面,如果它在那里。这是Google对creating HTML snapshots的指导可能有所帮助的地方。这听起来像你可能想要追求选项3.你也可以修改你的服务以输出除了JSON之外的HTML。

+0

感谢您的详细解释。我学到了很多东西。我的主要(个人)牛肉与这整个方法是,我必须在客户端上使用c#和JavaScript在服务器上生成内容。保持两个库同步只是简单的错误。 – AyKarsi 2011-01-29 09:49:33

0

我已经或多或少的放弃了这一点。如果你想要goolge为你的目录建立索引,那么在服务器上生成html并在html bdoy中传递html看起来似乎别无选择。

我甚至尝试添加一个节,它包装了一个.net用户控件,它实现了一个简单的html版本的目录。但谷歌也设法忽略..

所以最后我的目录已被去掉了。 :(