2011-01-27 18 views
0

在我寫的路由代碼爲我的MVC框架,它能夠呈現HTML諧音(視圖)的時刻區分。這些部分可以加載服​​務器端或客戶端(使用Mootools HTML請求)。然後每個頁面的佈局由多個部分構成。正如我希望它是休息柔順的,每個HTML部分(視圖)映射到所定義的URL空間中的URL,如下(縮進表示意文件結構):請求HTML部分和/全佈局相同的URL路徑

... 
/  
    /navigation 
    /content 
    /profile 
     /profile/1 
     /profile/1/message/ 
      /profile/1/message/1 
      /profile/1/message/2 
... 

現在的問題是,我想人們可以訪問「/ profile」,然後不顯示HTML部分,而是完整的佈局。我想了解以下信息:

1)在URL中的泛音創建一個單獨的命名空間/前綴,例如:

    爲全面佈局
  • /profile文件
  • /分/ profile文件的部分

2)發送一個自定義HTTP頭來請求一個部分的或沒有自定義HTTP頭來請求完整的佈局。

第一個選擇是多休息兼容(高速緩存友好的),但我仍然不能確定(這是真正的問題),其他選擇可能仍然是未知的我。

在我開始實施上述解決方案之一,我有以下問題:

  1. 我有什麼要求的替代品泛音和全佈局之間進行區分?
  2. 什麼是保持每個部分的客戶端狀態/上下文的最佳實踐?
+0

我不明白確切的問題。鑑於您描述的URL hiearchy,您可以在http://example.com/content/profile/1/message/2上提供消息的資源,並在http://example.com/content/profile/上提供該配置文件1 – ordnungswidrig

+0

的問題是,我需要請求「example.com/content/profile/1」之間進行區分作爲部分不* *佈局(無頁眉,頁腳和導航)以及請求「example.com/content/profile/ 1「作爲部分*包括*佈局(包括頁眉,頁腳和導航)。這應該以緩存友好的方式完成。 – Komerdoor

回答

1

當您請求客戶端時,服務器將接收額外的頭HTTP_X_REQUESTED_WITH與值xmlhttprequest。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    .... 
} 

這是一個可靠的頭測試,而不是添加自定義類型。

+0

謝謝。我只注意到Mootools正在這樣做,但它被mod_rewrite剝離了。 但問題是,使用自定義HTTP標頭來獲取不同的內容不緩存友好。緩存層無法區分GET/profile(無自定義標頭)和GET/profile(帶自定義標頭)。當然有些緩存可能支持它,但這不是可以假設的。 然後我剛剛意識到我可以像?route = partial一樣添加一個URL參數來請求一個部分,就像他們通常使用format = 來覆蓋Accept頭一樣。 – Komerdoor

+0

我看到Varnish可以區分X-Requested-With HTTP標頭。對於服務器端組合版本(經典風格),我可以使用ESI讓Varnish包含部分。對於客戶端組合版本(ajax樣式),可以使用HTML請求來包含部分。在這兩種情況下,Varnish都會爲我緩存偏分量。唯一存在的問題是,大多數Web瀏覽器將無法做出區分,並且可能會從瀏覽器緩存中顯示錯誤的緩存內容(部分而不是全部佈局,包括部分內容)。感謝你讓我走上正軌。 – Komerdoor

+0

另一個選擇是將第二個主機名別名到服務器,僅用於部分視圖,然後在服務器代碼中測試前綴。完整頁面視圖將來自example.com/content/...,但部分視圖來自p.example.com/content/ ... – leebriggs

1

方案1無疑是一個較好的解決方案,選擇2.在RESTful系統中,我們創造新的資源,所有的時間來彌補缺少的方法。

創建一個自定義標題是一個非常糟糕的主意。

+0

的確如此。根據用於區分表示的自定義標題,肯定會腐蝕大多數高速緩存。我只設置了一個清漆,它將作爲服務器上的單一標誌和使用ESI的對象高速緩存(僅在佈局由服務器端組成時使用)。現在我可以保持我的MVC代碼儘可能乾淨。 Redis(NoSQL)驅動程序和HTML幫助程序是超過20行代碼的唯一部分。我瞭解到的一個原則是,大多數較早的Web標準都經過深思熟慮,通常解決方法意味着您在做錯事或處於錯誤的級別。謝謝你的回答。 – Komerdoor