PHP處理COOKIE是一件很方便的事情。print_r($_COOKIE)就能夠打印全部的cookie變量。並且cookie也可以存爲數組。確實操做和應用都很是方便 。php
之前,對於子域和根域下的cookie並無研究太深。由於都直接設在根域的。之前注意cookie是路徑(path),這個的影響也是有的。不過如今大多數程序的cookie都是設在根路徑(「/」)下,因此也迴避了很多問題。數組
如下是老王提出的問題和解決方法(子域和根域同名cookie的處理),引申開的話,你也能夠測試一下,根路徑與子路徑下同名cookie的狀況。【果真,老王文章結尾就是這樣的提問,呵呵】瀏覽器
咱們都知道,在子域下請求時,瀏覽器會把子域和根域下的Cookie一塊兒發送到服務器,那若是子域和根域下有一個同名Cookie,當咱們在PHP裏使 用$_COOKIE訪問時,到底生效的是哪一個呢?下面作試驗測試一下,測試使用Firefox,用到了如下插件:SwitchHosts+WebDeveloper+Firebug。
注意:試驗結果可能由於瀏覽器的不一樣而存在差別。
首先經過SwitchHosts設定虛擬域名:www.foo.com,而且配置好Web服務器,固然,你手動設置Hosts文件也能夠,我本意是爲了多介紹幾個工具。
而後編寫設置Cookie的PHP腳本,先設置子域,再設置根域:服務器
PHP代碼cookie
再編寫瀏覽Cookie的腳本:工具
PHP代碼測試
BTW:最初寫腳本的時候我居然在setcookie前使用了var_dump,也就是在發送請求頭以前有了輸出,犯了這樣的初學者錯誤實在是罪過,可更使人驚訝的是腳本沒有報錯,查了半天原來是由於php.ini裏缺省output_buffering = 4096。
先設置再瀏覽,就能看到結果了,結果顯示有效的是子域下的Cookie。
重開一個瀏覽器窗口,並使用WebDeveloper刪除Cookie,或手動刪除,避免對結果形成影響。
而後調換兩次調用setcookie的順序,也就是先設置根域,再設置子域:spa
PHP代碼firefox
先設置再瀏覽,就能看到結果了,結果顯示有效的是根域下的Cookie。
重複兩次測試過程,並用Firebug記錄下請求頭的差別:
第一次先設置子域,再設置根域:請求頭Cookie的值是bar=www;bar=foo
,結果有效的是bar=www
第二次先設置根域,再設置子域:請求頭Cookie的值是bar=foo;bar=www,結果
有效的是
bar=foo
插件
也就說,同名Cookie對於服務端PHP來講,在請求頭Cookie中,哪一個在前哪一個生效,後面的會被忽略。
若是使用的不是Firefox,那就用不了Firebug,此時能夠用PHP代碼來檢測Cookie頭:
PHP代碼
if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);
以上的實驗結論是基於Firefox而言的,因爲不一樣的瀏覽器發送Cookie的策略可能有差別,因此在其餘瀏覽器上結果可能會有所不一樣,好比在 Safari下就始終是子域有效,其餘瀏覽器如Opera,Chrome等未仔細測試。鑑於這個混亂的結論,因此仍是不要在子域和根域下使用同名 Cookie爲好!