2011-01-25 40 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版本的目錄。但谷歌也設法忽略..

所以最後我的目錄已被去掉了。 :(