php 設定cookie路徑例子總結

來源:互聯網
上載者:User

先看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路徑設定懂了沒有其它就是我們要使用那個就設定那個路徑了,如果是多網域名稱就直接設定主網域名稱就可以了,如果是目錄指定目錄就行了,如果是單檔案指定單檔案路徑就可以了哦。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.