2013-04-26 29 views
0

我們使用服務器的「Last-Modified」響應標頭和資源驗證的「If-Modified-Since」請求標頭。 HTTP頭定義指出「If-Modified-Since」應該包含從服務器接收到的值(它不禁止使用其他值)。 在某些時候,我們開始使用「上次更新的時間」作爲客戶端發送的「If-Modified-Since」的值。 「上次更新時間」是客戶端上次收到服務器更新(新版本的資源或304錯誤)的時間。我們被告知,由於可能的時間同步問題,我們不得使用任何客戶端生成的時間。在「If-Modified-Since」HTTP標頭中使用客戶端生成的時間

當然所有時間都以GMT表示。

我無法找到確認這是要求。很高興聽到espert對此的看法是必須使用從服務器返回的值作爲「If-Modified-Since」的值或者存在某種程度的靈活性?在什麼情況下可以使用客戶端生成的時間?

非常感謝

回答

1

如果客戶端的時鐘快服務器的時鐘,它是無效的指定日期/時間是後服務器的當前時鐘(HTTP規範,即使是這麼說的)。

如果客戶端的時鐘是背後的服務器時鐘的,起碼,你可能最終得到時,你可能會期待一個304答覆代替,這是不是一個錯誤,但會浪費帶寬發送一個真正的,未經修改的一個200回覆資源。

無論哪種方式,最好使用服務器的日期/時間值。事實上,HTTP規範確實是這麼說的第14.25

注:當處理一個If-Modified-Since頭領域,一些 服務器將使用精確日期比較功能,而不是一個 低於函數,用於決定是否發送304(不是 修改)響應。在發送時,得到最佳結果如 - Modified-Since的緩存驗證頭字段,都 建議客戶端使用在前面的最後所 Modified頭字段可能收到每當確切日期字符串。

注:如果客戶端使用在任意日期的If-Modified-由於 頭,而不是從Last-Modified頭採取 相同的請求的日期,客戶應該知道的事實,這個 日期是在服務器對時間的理解中解釋的。該 客戶應考慮非同步時鐘,並且由於在客戶端和服務器 之間的時間不同的編碼四捨五入問題 。這包括的競爭條件的可能性,如果 文檔已它第一次請求的時間和 之間改變了的If-Modified-由於後續請求的日期,並且如果了If-Modified的時鐘偏斜相關問題的 可能性 - 由於日期是從客戶端的時鐘產生不改正 到服務器的時鐘。客戶端和服務器之間的不同時間基準 的更正由於網絡延遲而最多近似。

+0

謝謝,很好的答案。因此,客戶端應該更好地使用服務器端生成的時間,但是(如果它意識到問題)可能會違反規則。 – LeonidVlad 2013-04-29 22:48:28

0

如果客戶端的時鐘快服務器的時鐘,客戶端可能會錯過不斷得到更新,如果它要求,因爲它最後接收使用其自己的時鐘一份修改的文檔。假設客戶端時鐘提前5秒。考慮這一系列事件:

  • 在服務器時鐘1:00:00,根據客戶端時鐘1:00:05創建文檔X.根據客戶端時鐘
  • 在二點30分零零秒由服務器時鐘,二點30分05秒,客戶端請求以獲得文獻X.
  • 服務器發送文件X具有的1:00:00一個Last-Modified報頭。
  • 在2:30:03由服務器時鐘,文檔X被修改。
  • 在3:30左右,客戶要求提供文件X,如果自2:30:05以來它已被修改。
  • 服務器回覆,未修改。

這並不是說客戶端從服務器的角度指定了未來的時間。問題在於它不會得到一小時前修改過的文檔,因爲它告訴服務器它已經有了它。