2012-03-12 29 views
5

Tôi cần sử dụng các cookie miền chính cho các miền phụ của mình với mức độ ưu tiên cao hơn khi cả cookie phụ và miền chính tồn tại.Làm thế nào để đọc cookie chính từ miền phụ với cookie miền phụ hiện có trong PHP?

Vấn đề là khi tôi đang trên sub.domain.com và có tồn tại cookie cho

  • sub.domain.com
  • .domain.com

Các PHP toàn cầu $_COOKIE chứa $_COOKIE['data'] == 'sub.domain.com'. Tôi muốn kiểm tra xem có một cookie .domain.com và sử dụng cookie đó không.

Làm cách nào để đọc cookie chính khi tôi ở trên miền phụ có cookie miền phụ hiện có?

Trả lời

2

Có biến số $_SERVER ['HTTP_COOKIE'] chứa cả tên miền phụ và các biến cookie miền chính có cùng tên với một chuỗi lớn. Trong mảnh đơn giản sau mã mảng $cookie_variable sẽ chứa cả hai giá trị của các biến cụ thể:

if('sub.domain.com' == $_SERVER['HTTP_HOST']) { 
    $var_name = 'somedata'; 
    $domains_counter = 0; 
    foreach(explode(';', $_SERVER['HTTP_COOKIE']) as $cookie_variable_string) { 
    if(false !== strpos($cookie_variable_string, $var_name.'=')) { 
     $cookie_variable[$domains_counter] = urldecode(
      trim(
       substr(
        $cookie_variable_string, 
        strpos($cookie_variable_string, $var_name) + strlen($var_name.'=') 
      ) 
     ) 
    ); 
     $domains_counter++; 
    } 
    } 
    var_dump($cookie_variable); 
} 

Dưới đây là một chức năng mà được tất cả các biến:

public static function get_http_cookie_variables() { 
    $domains_counter = []; 
    foreach(explode(';', $_SERVER['HTTP_COOKIE']) as $cookie_variable_string) { 
    $key_value = explode('=', $cookie_variable_string); 
    $cookie_var_name = trim($key_value[0]); 
    if(is_null($domains_counter[$cookie_var_name])) { 
     $domains_counter[$cookie_var_name] = 0; 
    } 
    $http_cookie_variables[$cookie_var_name][$domains_counter[$cookie_var_name]] = urldecode(trim($key_value[1])); 
    $domains_counter[$cookie_var_name]++; 
    } 

    return $http_cookie_variables; 
} 
+0

get_http_cookie_variables() chức năng không thành công vì $ domains_counter không được khởi tạo. Tôi chỉ đơn giản là loại bỏ nó tất cả vì tôi không quan tâm đến điều đó. – user603749

4

Dường như ý chính của vấn đề của bạn đang đọc tập hợp cookie trong domain.com từ sub.domain.com.

Thêm

session.cookie_domain = .domain.com

để php.ini của bạn để thực hiện điều này. Nếu bạn đang ở trên một môi trường lưu trữ chia sẻ và không thể sửa đổi tập tin ini của bạn, hãy thử có một nơi nào đó trong mã của bạn:

ini_set("session.cookie_domain", ".domain.com");

Bây giờ bạn sẽ có thể truy cập các tập tin cookie được thiết lập bởi domain.com trên tên miền phụ .domain.com.

+0

Cảm ơn bạn đã trả lời, nhưng đây là sự thay đổi quá toàn cầu mà tôi muốn tránh nếu có thể, bởi vì nó làm cho phiên làm việc toàn cầu cho tất cả các miền phụ. Tôi muốn các phiên được tách riêng cho các miền phụ. Tôi chỉ cần đọc một phần cookie của miền chính. Tôi đã có thể truy cập cookie miền chính, nhưng chỉ khi không có cookie miền phụ, vì lý do nào đó được máy chủ ưu tiên. Có cách nào để đọc cả hai cookie cùng một lúc? – mvladk

+0

Sử dụng phương thức 'ini_set()' phải đảm bảo rằng các thay đổi cấu hình chỉ ảnh hưởng đến trang web của bạn trong thời gian yêu cầu (nếu bạn lo lắng những thay đổi sẽ ảnh hưởng đến các trang web khác chạy trên máy chủ của bạn). –

+0

Jahufar cảm ơn bạn rất nhiều! Tôi rất cảm kích sự tham gia của bạn. – mvladk

Các vấn đề liên quan