先看phpcms中的一個函數
| 代碼如下 |
複製代碼 |
phpcms/libs/classes/param.class.php /** * Set Cookie * @param string $var * @param string $value * @param int $time * @param string $path */ public static function set_cookie($var, $value = '', $time = 0, $path = '') { $time = $time > 0 ? $time : ($value == '' ? SYS_TIME - 3600 : 0); $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0; $var = pc_base::load_config('system','cookie_pre').$var; $path = $path == '' ? pc_base::load_config('system','cookie_path') : $path; $_COOKIE[$var] = $value; if (is_array($value)) { foreach($value as $k=>$v) { setcookie($var.'['.$k.']', sys_auth($v, 'ENCODE'), $time, $path, pc_base::load_config('system','cookie_domain'), $s); } } else { setcookie($var, sys_auth($value, 'ENCODE'), $time, $path, pc_base::load_config('system','cookie_domain'), $s); } } param::set_cookie('auth', '',time()-1,'/'); |
這個函數與cookie沒什麼區別我們先不介紹它,可能很多朋友懂,下面我們再看
setcookie函數的第四個參數為cookie路徑,關於路徑的設定,本文做了一些嘗試,下面是兩個測試頁(直接用url表示路徑和檔案目錄了):
http://localhost/test/cookie/father.php
http://localhost/test/cookie/child/child.php
| 代碼如下 |
複製代碼 |
<?php //location: locahost/test/cookie/father.php //setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); setcookie("father_set_1_/","@@@@",time()+24*3600,"/"); setcookie("father_set_2_/child","@@@@",time()+24*3600,"/child/"); setcookie("father_set_3_test/cookie/child","@@@@",time()+24*3600,"/test/cookie/child/"); print_r($_COOKIE); ?> |
| 代碼如下 |
複製代碼 |
<?php //location: localhost/test/cookie/child/child.php //setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); setcookie("child_set_0","@@@@",time()+24*3600); setcookie("child_set_1_/","@@@@",time()+24*3600,"/"); setcookie("child_set_2_/child","@@@@",time()+24*3600,"/child"); setcookie("child_set_3_/test/cookie/child/","@@@@",time()+24*3600,"/test/cookie/child/"); print_r($_COOKIE); ?> |
分別按如下順序訪問頁面father.php—>child.php—>father.php—>child.php,使用firebug查看,分別有如下結果:
第一訪問father.php
圖中可以看出,本次請求服務端做出響應,列印了$_COOKIE數組,但數組為空白。設定了三個cookie值,分別是:"father_set_1_/"、"father_set_2_/child"、"father_set_3_test/cookie/child",它們對應的路徑為"/"、"/child"、"/test/cookie/child",其中"/"指的是網站根目錄。
第一次請求father.php時,初始狀態下用戶端沒有相關的cookie記錄,在上圖中只有已收到的cookie,沒有已發送的cookie,則列印$_COOKIE數組時是沒有輸出。
從上面這點可以看出,頁面的每次請求cookie的變化是:頁面請求時瀏覽器發送用戶端已有的cookie,伺服器端接收cookie將其存入數組$_COOKIE數組中供程式使用;而在伺服器端響應本次請求設定的cookie尚未發送到用戶端時$_COOKIE數組中是沒有記錄的。
第一次訪問child.php
訪問child.php能看到請求中發送了兩個cookie分別為"father_set_1_/"、"father_set_3_test/cookie/child",接收到四個cookie分別是"child_set_0"、"child_set_1_/"、"child_set_2_/child"、"child_set_3_/test/cookie/child/"。
頁面列印出的$_COOKIE數組中有兩個值,分別是請求時發送的資料。
這裡有個貌似奇怪的地方,列印出的$_COOKIE數組只有兩個呢,第一個father.php頁面不是設定了三個cookie值嗎,為什麼不能訪問"father_set_2_/child"呢?
這裡仔細分析就沒有什麼奇怪的了,瀏覽器每次發出請求只發送父級路徑和當前路徑下的cookie給伺服器,服務端的$_COOKIE數組也就是來自每次請求中的發送cookie,這也意味著一個頁面只能訪問路徑設定為當前頁面路徑和父路徑的cookie,不能訪問兄弟路徑的cookie。
第二次訪問father.php
第二次訪問father.php列印出了二個值,也就是本次請求發送了兩個值,也就是意味著father.php能訪問兩個值它們分別是"father_set_1_/"、"child_set_1_/"對應的路徑都是"/"。
這裡就能看出來father.php雖然設定了三個cookie,但由於路徑的原因瀏覽器請求時並沒有發送其他子路徑的cookie以至於不能讀取。其中"child_set_1_/"是子路徑下的版面設定的cookie,由於路徑是本頁面所在路徑則能讀取。
還有一點值得注意的是,這次訪問時沒能列印出"child_set_0"的值,在child.php中"child_set_0"的路徑是為空白的,這點是預設為當前路徑,而不是網站根目錄的,所有子路徑想設定cookie讓父路徑的頁面訪問則需要設定路徑的。
第二次訪問child.php
再次訪問child.php一共能列印出5個值,沒能列印出路徑為"/child"的cookie,這點說明瀏覽器只發送“直系”路徑關係的cookie值
好了現在不知道你對cooke路徑設定懂了沒有其它就是我們要使用那個就設定那個路徑了,如果是多網域名稱就直接設定主網域名稱就可以了,如果是目錄指定目錄就行了,如果是單檔案指定單檔案路徑就可以了哦。