今天同事遇到一個問題,大概描述以下:瀏覽器
瀏覽器已經接收指令,以前在一級域名下存儲了相關的信息。這裏爲了簡化問題,假設咱們有兩個應用A和B,域名分別爲:a.b.com
和c.a.b.com
。(顯然B是A的一個子域)。服務器
上面的描述就是:在.b.com這個一級域名下,咱們已經成功寫入了一個cookie,假設爲:b=level1
。cookie
在正經常使用戶的瀏覽行爲中,應用A會向本身的域下寫入a=level2
(domain:a.b.com
)。網絡
在A正常的頁面中,有些場景會有異步的請求發出到B應用的頁面(用於獲取數據),合理的一種想法是:發送到B應用的請求,應該攜帶着上面的b=level1
,a=level2
這兩個cookie信息到B應用的服務器去纔對。可是,實際的狀況是,b=level1
被如願攜帶上來,可是a=level2
這個信息卻被丟棄了!(確切的說是沒有跟着request一塊兒被髮送到B的服務端)。dom
爲啥?在訪問子域應用時,不是父域名下的cookie都應該被攜帶上來嗎?就像上面的b=level1
那樣?異步
其實,關於這點,在cookie的RFC規範中,並無太明顯的說明,至少我沒有看到,即便又看了一遍RFC6265中關於Domain Matching的描述也是如此。code
但實際的使用過程當中,某個域下的cookie若是但願可以被他的子域具備可見性(便可以讀取),必需要注意的一點是,應該保證這個cookie在被Set的時候,應該以"."開頭。回到上面的例子,之因此a=level2
這個cookie沒有在用戶瀏覽器請求B應用時被攜帶到B的server端,就是由於a=level2
這個cookie的domain不是.a.b.com
,而是a.b.com
。server
事實上,上面例子中的A應用,在向本身的域名下寫入a=level2
這個cookie時,壓根就沒有顯示的設置domain這個屬性,這樣一來,瀏覽器接受到這個Set Cookie
的請求時,就會以默認以當前應用的域名做爲cookie的domain。(不過聽說某些版本的Firefox到是會自做聰明的在當前域名的前面自動加上一個點,這個待驗證!)get
這一個小點的區別,仍是很容易被忽略的,不過產生的瀏覽行爲仍是有細微差異的。(涉及到cookie是否上傳,是否佔用網絡流量等)域名
PS:關於上面說到的那個問題,stackoverflow上的這個有個截圖,看着說明就直觀不少了。