2010-09-27 114 views
23

我在寫一個充當非常基本的HTTP客戶端的小類。作爲我正在開發的一個項目的一部分,我讓它瞭解cookie。但是,我不清楚當我的客戶端收到多個具有相同密鑰但設置了不同值的「Set-Cookie」頭時會發生什麼。HTTP中的多個Set-Cookie頭文件

例如,

Set-Cookie: PHPSESSID=abc; path=/ 
Set-Cookie: PHPSESSID=def; path=/ 
Set-Cookie: PHPSESSID=ghi; path=/ 

這些哪一個應該是爲PHPSESSID的價值?當您在同一頁面上調用session_start()和session_regenerate_id()時,通常會發生這種情況。每個將設置它自己的標題。所有的瀏覽器似乎都可以做到這一點,但我似乎無法讓我的客戶選擇正確的一個。

有什麼想法?

回答

21

RFC 6265 section 4.1.2狀態:

如果用戶代理接收到具有相同的cookie名新cookie
域值和路徑值作爲一個cookie,它已經存儲,
的現有的cookie被驅逐並被替換爲新的cookie。
注意,服務器可以通過發送用戶代理
新的cookie與刪除cookies到期,在過去一個屬性值。

所以我會按給定的順序處理標題,如果有重複的話就覆蓋它們。所以在你的情況下,你只會有一個PHPSESSID = ghi。

10

RFC 6265狀態:

服務器不應包括與相同的cookie名稱相同的響應多於一個的Set-Cookie報頭字段。

因此,如果您的服務使用相同的密鑰發送多個Set-Cookie頭,我會非常關心。特別是因爲我看到用戶代理和代理意外行爲 - 有時會獲取第一個標頭的值,有時會重新排列標頭。

作爲客戶端,典型的用戶代理行爲似乎是採取最後標頭的值。 RFC通過以下聲明暗示該行爲:

如果用戶代理收到一個具有相同cookie名稱,域值和路徑值的新cookie作爲它已存儲的cookie,則現有cookie被驅逐並被新的cookie取代。

+0

這並不是說不應發送多個set-cookie標頭。這是說多個標頭具有相同的cookie名稱。 – Blaze 2015-06-19 19:11:51

+0

固定,以防從OP的上下文中不清楚。 – 2015-06-19 19:15:55