因爲我遇到的奇怪的域/子域Cookie問題,我想知道瀏覽器如何處理Cookie。 若是他們以不一樣的方式來作,那麼瞭解它們之間的差別也將是一件很高興的事情。 javascript
換句話說-當瀏覽器收到一個cookie時,該cookie可能有一個域和一個附加的路徑。 是否能夠,在這種狀況下,瀏覽器可能會用一些默認值替代它們。 問題1:它們是什麼? html
稍後,當瀏覽器即將發出請求時,它會檢查其cookie並過濾掉應爲該請求發送的cookie。 它經過將它們與請求路徑和域進行匹配來實現。 問題2:有哪些匹配規則? java
我問這個的緣由是由於我對一些極端狀況感興趣。 喜歡: web
.example.com
的cookie是否可用於www.example.com
? .example.com
的cookie是否可用於example.com
? www.example.com
是否可使用example.com
的cookie? example.com
的cookie是否可用於anotherexample.com
? www.example.com
能夠爲example.com
設置cookie嗎? www.example.com
可以爲www2.example.com
設置cookie嗎? www.example.com
可以爲.com
設置cookie嗎? 新增2: 瀏覽器
另外,有人能夠建議我應該如何設置Cookie,以便: 服務器
www.example.com
或example.com
進行設置; www.example.com
和example.com
訪問。 有關普遍的內容,請查閱RFC2965的內容。 固然,這並不必定意味着全部瀏覽器的行爲都徹底相同。 cookie
可是,一般,默認路徑(若是cookie中未指定)的默認規則是Set-Cookie標頭從其到達的URL中的路徑。 一樣,域的默認值是Set-Cookie到達的URL中的完整主機名。 app
域的匹配規則要求Cookie域與要向其發出請求的主機匹配。 Cookie能夠經過包含*指定更普遍的域匹配。 在Set-Cookie的domain屬性中(瀏覽器的這一區域可能有所不一樣)。 匹配路徑(假設域匹配)很簡單,請求的路徑必須在cookie上指定的路徑內。 一般,會話cookie是使用path = /或path = / applicationName /設置的,所以cookie可供應用程序中的全部請求使用。 dom
*
我如今沒法對此進行測試,但我暗示至少IE7 / 6會將路徑example.com
視爲.example.com
。 測試
儘管如今有應該定義cookie的RFC 2965 ( Set-Cookie2
,已通過時的RFC 2109 ),可是大多數瀏覽器並不徹底支持cookie,而是僅符合Netscape的原始規範 。
域屬性值和有效域之間是有區別的:前者來自Set-Cookie
標頭字段,後者是對該屬性值的解釋。 根據RFC 2965,如下內容應適用:
.
開頭,則它將由客戶端添加)。 擁有有效域後,它還必須與當前請求的域進行域匹配以進行設置; 不然,cookie將被修改。 相同的規則適用於選擇要在請求中發送的cookie。
將這些知識映射到您的問題上,應遵循如下條件:
Domain=.example.com
將可用於www.example.com Domain=.example.com
將可用於example.com Domain=example.com
將被轉換爲.example.com
而且所以也將可用於www.example.com Domain=example.com
Cookie 不適用於anotherexample.com 並設置和讀取www.example.com和example.com的cookie,分別將其設置爲.www.example.com
和.example.com
。 可是第一個( .www.example.com
)僅可用於該域下的其餘域(例如foo.www.example.com或bar.www.example.com ),在該域中,任何用戶均可以訪問.example.com
example.com下面的其餘域(例如foo.example.com或bar.example.com )。
有一些規則肯定瀏覽器是否接受Set-header響應頭(服務器端cookie編寫),使用Javascript設置cookie的規則/解釋略有不一樣(我還沒有測試VBScript)。
而後是肯定瀏覽器是否將與頁面請求一塊兒發送cookie的規則。
主要瀏覽器引擎之間的區別在於如何處理域匹配以及如何解釋路徑值中的參數。 您能夠在文章「不一樣的瀏覽器如何不一樣地處理Cookie」中找到一些經驗證據。
此問題的最後一個(確切地說是第三個)RFC是RFC-6265(已淘汰RFC-2965,然後者又淘汰了RFC-2109)。
根據它,若是服務器省略了Domain屬性,則用戶代理將cookie僅返回到原始服務器 (給定資源所在的服務器)。 但這同時也警告某些現有用戶代理將缺乏的Domain屬性視爲存在Domain屬性幷包含當前主機名(例如,若是example.com返回不具備Domain屬性的Set-Cookie標頭,則這些用戶代理會也會將Cookie錯誤地發送到www.example.com)。
指定Domain屬性後,它將被視爲完整的域名(若是屬性中有前導點,它將被忽略)。 服務器應匹配屬性中指定的域(具備徹底相同的域名或做爲其子域)以獲取此cookie。 更準確地說是在這裏指定的 。
所以,例如:
Domain=.example.com
等效於Domain=example.com
Domain=www.example.com
將關閉www4.example.com的方式 PS:「域」屬性中的尾部逗號將致使用戶代理忽略該屬性=(
www.example.com
可以爲.com
設置cookie嗎?
否,可是example.com.fr
可能能夠爲example2.com.fr
設置cookie。 Firefox經過維護TLD列表來防止這種狀況: http : //securitylabs.websense.com/content/Blogs/3108.aspx
顯然Internet Explorer不容許兩個字母的域設置cookie,我想這解釋了爲何o2.ie
只是重定向到o2online.ie
。 我常常想知道。