随着web2.0的興起,ajax的時代已經成為了事實,更如今knockout,backbone, angular,ember前端mdv(model driver view)架構強勢而來,single page application已經為大家所熟悉了。如今常見的spa程式,restfull和前端mdv之類的架構能夠實實在在的減少我們的代碼開發量,讓我更多的注意力關注在真正的業務邏輯上。在衆多前端mdv架構從部落格中可以看出來筆者還是鐘愛于angular,然而服務端平台的選擇的話:在.net平台筆者會首選webapi+odata,jvm平台spring restfull。
在協定中規定,搜尋引擎會把帶有#!someurl的連結轉換為escaped_fragment=someurl通路解析,例如:
1
<code>www.example.com/ajax.html#!key=value</code>
将會變為
<code>www.example.com/ajax.html?_escaped_fragment_=key=value</code>
是以如果我們需要更好的seo的支援的話,我們可以從現在開始把我們程式中的#變為#!,特别angular程式,因為架構原聲支援對#!的解析。
prerender架構流程圖如下:

prerender分為兩個部分一部分為後端雲服務和應用程式用戶端,用戶端主要攔截來自爬蟲的請求在轉發到後端雲服務處理傳回處理後并且去掉多餘script/css的html在傳回給爬蟲。
後端雲服務(nodejs項目),利用phantomjs這個無ui headless的浏覽器核心加載頁面位址,并等到頁面解析後擷取document html,并處理去掉無用的部分傳回到前段用戶端程式。
而前段程式則為不同語言架構而實作的不同攔截器,如java的filter,asp.net mvc的httpmodule,主要任務為攔截請求并轉發給後端雲服務處理。其攔截規則為:
檢查url中是否帶有escaped_fragment或者請求user-agent是已知或者配置的爬蟲user-agent
确認攔截的不是js,css之類的資源檔案
在确認url是在白名單中(可選如果配置的白名單的話)
确認不應該在黑名單中(可選如果配置了黑名單的話)
注:最好值配置黑名單或者白名單中的一種方式。