2010-01-24 82 views
10

似乎有是兩種不同的方式使用HTTP標頭以實現有條件的請求,這兩者可用於緩存,範圍請求,併發控制等...:If-Unmodified-Since/If-Modified-Since是什麼意思?他們不是被ETags取代嗎?

  1. 如果未修飾-Since和If - 修改 - 自,其中客戶端發送資源的時間戳
  2. If-Modified和If-None-Modified,其中客戶端發送資源表示的ETag

在這兩種情況下,客戶端都會發送一條關於資源的信息,它允許服務器確定自從客戶端上次看到資源時是否更改資源。然後服務器根據客戶端提供的條件頭來決定是否執行請求。

我不明白爲什麼有兩種單獨的方法可用。當然,ETags取代時間戳,因爲服務器可以很容易地選擇從時間戳生成ETags。

所以,我的問題是:

  • 在這情況下,您可能有利於如果未修飾的,因爲/ IF-Modified-Since的過度的ETag?
  • 在哪些情況下你可能需要兩個?
+1

儘管可能是切向的,但還有另一種方法可以發出條件請求:If-Range。它可以使用ETage或時間戳。 – 2011-11-28 14:34:45

回答

11

我曾經思考過同樣的事情,並認識到有一點是非常重要的差別:日期可以是有序的,ETags不能。

這意味着如果一些資源在一年前被修改過,但從未改變過,而且我們知道它。然後,我們可以正確回答去年的任意日期的If-Unmodified-Since請求,並同意確保...從那天起它一直未修改。

一個Etag只能對身份進行比較。要麼它是相同的或不是。如果您擁有與上述相同的資源,並且在一年中將docroot移動到新的磁盤和文件系統,爲所有文件提供新的inode但保留修改日期。有人根據文件的inode編號創建了ETags。然後,我們不能說舊ETag仍然沒有問題,沒有過去 - 仍然可以 - ETags的日誌。

所以我不認爲他們是一個過時的另一個。他們針對不同的情況。您可以很容易地獲得您要提供服務的頁面中所有數據的Last-Modified日期,或者您可以輕鬆獲取ETag以獲取您要提供的服務。

如果您有一個動態網頁,其中包含大量數據庫查找的數據,則可能很難說出Last-Modified日期,而不會使數據庫包含大量修改日期。但是,您始終可以對結果呈現頁面進行md5校驗和。

當支持這些緩存協議時,我絕對只會選擇其中一個,永遠都不會。

+0

Upvoted,這是一個很好的觀點。 但是,ETags總是隻能爲身份比較嗎?這不取決於服務器作爲Etag值使用什麼?例如,據我瞭解,服務器可以選擇使用原始時間戳作爲某些資源的ETag。這樣,ETags將被訂購這些資源。 因此,如果ETags可以有效地*時間戳,一個單獨的一對頭只能用於時間戳的點是什麼? – rewbs 2010-01-24 19:14:53

+4

您需要在代理中添加代理。如果你的Etag值具有語義含義,他們現在就不瞭解它。 – Christian 2010-01-24 23:52:07

1

簡單的原因:向後兼容。

+0

好的。您是否說If-Unmodified-Since和If-Modified-Since是遺留的,因此在您完全控制客戶端發送的頭文件和服務器處理的頭文件的情況下,您應該只使用ETags? – rewbs 2010-01-24 11:30:02

+0

對於驗證和/或有條件的請求,ETag是要走的路。然而,Last-Modified頭部在條件請求之外具有語義含義,如果您能夠控制所有內容,就應該發送。見http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.4 – 2010-01-24 11:37:08

-2

ETag是特定於服務器的 - 這意味着如果您的應用程序位於Web場中,則最終會在Web場的不同服務器上產生不同的ETags。所以在這種情況下應該使用If-Unmodified-Since/If-Modified-Since。你可以看看關於YSlow rules page的更詳細的解釋。

+3

這通常不是真的,即使你最終可能會遇到這種情況。您在不同的Web服務器提供的不同硬盤驅動器上具有相同的文件。 – 2010-01-24 14:02:00

+0

正如我所說的,當使用網絡農場(多個服務器)時 - 不同的服務器上的ETag是不同的。 – 2010-01-24 14:43:28

+2

它們只有以這種方式實現纔有所不同。 YSlow在apache中提到了一個默認的實現,它使用文件inode作爲E​​Tag的一部分。 ETag的內容是不透明的,更好的實現可以對所提供的內容使用校驗和。 – Christian 2010-01-24 15:30:14

3

有一個相當大的區別:我只能使用ETags,如果我已經問了過去的服務器。時間戳,OTOH,我可以彌補,因爲我走了。