2010-01-21 107 views
41

以下HTTP 1.1標頭是什麼意思?HTTP標頭是什麼If-None-Match:*是什麼意思?

如果 - 無 - 匹配:*

使用強或弱的ETag甚至ETag的名單時,我明白了,但我不understant它的使用使用星時(*) 。

編輯:會很高興有一些僞代碼(PHP代碼也不錯),它將顯示如何/如何回答「If-None-Match:*」。

回答

36

答案是:這取決於。

假設我們已經收到

If-None-Match: * 
If-Modified-Since: <yesterday date> 

今天的頁面已被修改

首先,我們來看看*,它告訴我們:「如果資源在那裏,則返回304,並滿足條件(2)」。很好,資源存在,BUT條件(2)規定:「只返回304,如果日期晚於當前」。所以這個條件沒有得到滿足,並且頁面將被完全傳遞。

如果我們沒有收到If-Modified-Since,響應將是304

如果資源沒有根據要求存在,我們不得不返回相應的代碼(如如果沒有If-None-Match)。

304應該僅在GET和HEAD請求響應時返回,並且所有與緩存相關的響應頭都必須在那裏。對於所有其他類型的請求,服務器需要回答412(先決條件失敗)。

我希望它有幫助;)

+0

因此,如果在If-None-Match中有*,發佈304的唯一方法是當If-Modified-Since設置和匹配時? – AlexV 2010-02-01 14:03:31

+1

要麼是這樣,要麼根本沒有'If-Modified-Since'。所以有兩種方法。 – 2010-02-01 23:23:53

10

RFC 2616 (HTTP 1.1)報價:

...如果「*」,並給出任何當前實體存在該資源,那麼服務器不能執行請求的方法,除非必須這樣做,因爲資源的修改日期無法與請求中的If-Modified-Since標頭字段中提供的日期匹配。

RFC繼續表示,對於GET和HEAD請求,服務器應該用304(未修改)響應,而對於所有其他請求類型,它們應該以412(預先條件失敗)做出響應。但是,只有當服務器實際上擁有某個版本的請求資源時纔會這樣。如果你沒有任何實體,那麼你應該處理請求(可能與404,因爲你什麼都沒有)。

要處理請求,首先要弄清楚服務器如果不是存在,將會執行什麼操作。如果該請求的結果是而不是是2xx或304,則正常提供請求。但如果請求的結果是是2xx或304,則處理If-None-Modified情況。當它是一顆星星時,立即返回304(除非被If-Modified-Since誇大)。如果它是一個或多個實體標籤,那麼檢查這些標籤中是否有與您計劃作爲迴應的標籤匹配。如果有任何匹配,則返回304;如果沒有匹配,那就像平時一樣提供。

在RFC後來,還有更多:

的「如果 - 無 - 匹配:*」的含義是,如果原始服務器選擇的表現一定不會被執行的方法(或由緩存,可能使用Vary機制,請參見部分14.44),如果該表示不存在,則應該執行。此功能旨在防止PUT操作之間的競爭。

也就是說,明星允許客戶端說,「如果有任何這個文件已經存在,不要把這個文件。」

+3

這是什麼意思,在純英語?如果*提供,我只是正常服務頁面(沒有304)?即使If-Modified-Since被提供... – AlexV 2010-01-21 18:48:54