提到SitePoint文章的答案並不完全完整。請參閱RFC 6265(公平地說,這個RFC是在發佈這個問題後於2011年發佈的,它取代了之前的2000年的RFC 2965和1997年的RFC 2109)。
第5節。4條第2款有這樣一段話:
用戶代理應該排序的cookie的列表按以下順序:
注:並非所有的用戶代理進行排序的cookie的列表順序,但這 順序反映在本文撰寫常見的做法,而且, 歷史上,已經有服務器的(錯誤地)取決於 這個命令。
也有在4.2.2節這個小寶石:
...服務器不應依靠系列化的順序。特別是,如果Cookie標頭包含兩個具有相同名稱(例如,具有不同路徑或域屬性的設置)的cookie,則服務器不應該依賴於這些cookie出現在標題中的順序。
在您的示例請求的cookie(曲奇:A = 2; A = 1)注意,cookie中設置與路徑/示例(A = 2)具有長於一個路徑與路徑/(a = 1),所以它會首先發送給您,符合規範的建議。因此,你或多或少正確的假設你可以選擇的第一個值。
不幸的是RFC中所使用的語言是非常具體 - 使用的話SHOULD和不應該 RFC中引入歧義。這些表示約定應遵循,但不要求要求符合規範。儘管我很瞭解RFC,但我還沒有做過研究,看看真實世界的客戶端在做什麼;可能有一個或多個瀏覽器或其他軟件充當HTTP客戶端,可能不會首先在Cookie中發送最長路徑cookie(例如:/example),其中包括標頭。
如果你是在一個位置來控制cookie的值,你想使你的解決方案萬無一失,你最好把兩種:
- 使用不同的cookie名在某些路徑覆蓋
,如:
- 的Set-Cookie:一個全局= 1;路徑= /;版本= 1
- 的Set-Cookie:一個-示例= 2;路徑= /例子;版本= 1
存儲你在cookie值本身需要的路徑:
- 的Set-Cookie:A = 1條&路徑= /;路徑= /;版本= 1
- 的Set-Cookie:A = 2 &路徑= /例子;路徑= /例子;版本= 1
這兩種解決方法需要在服務器上額外的邏輯來挑選期望的Cookie值,由所請求的URL針對可用的餅乾的列表進行比較。這不太漂亮。不幸的是,RFC沒有先見之明要求更長的路徑完全覆蓋具有較短路徑的cookie(例如:在您的示例中,您將收到Cookie:a = 2只有)。
我會盡我所能(閱讀:我可以做的每件事)以避免重複的cookie名稱。大多數人從未遇到過這個問題 - 理由很充分。 – 2010-10-29 22:27:16