[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Php > 正文
實現跨域名Cookie
本文出自: 作者:Christopher Kings-Lynne 翻譯:limodou (2002-03-27 06:02:01)
  Cookie真是一個偉大的發明,它允許web開發者保留他們的用戶的登錄狀態。然而,當你的站點或網絡 
有一個以上的域名時就會出現問題了。 


  在Cookie規范上說,一個cookie只能用一個域名,不能夠發給其它的域名。因此,如果在瀏覽器中對 
一個域名設置了一個cookie,這個cookie對其它的域名將無效。如果你想讓你的用戶從你的站點中的其中 
一個進行登錄,同時也可以在其它域名上進行登錄,這可真是一個大難題。 


  我的解決方案將使用下面的一般框架: 

一個預置的腳本將用來接受通過GET或COOKIE方式傳遞過來的sessionid號。它將比COOKIE優先選擇GET 
變量。所以,無論何時需要引用交叉的域名時,我們把sessionid做為一個URL參數進行發送。 
修改Apache配置,用來實現重寫所有的交叉域名的cookie。這樣做的原因一會兒就會清楚了。 
在任何時候出現一個交叉域名引用時使用變量。 
第一步:創建預置腳本 
  將下面的代碼加到預置腳本中(或出現在所有腳本之前的函數中)。 

<?php 

/* 支持交叉域名cookie... */ 

// 如果GET變量已經設置了,並且它與cookie變量不同 
//則使用get變量(更新cookie) 
global $HTTP_COOKIE_VARS, $HTTP_GET_VARS; 
if (isset($sessionid) && isset($HTTP_GET_VARS[\'sessionid\']) && ($HTTP_COOKIE_VARS[\'sessionid\'] != $HTTP_GET_VARS[\'sessionid\'])) { 
SetCookie(\'sessionid\', $HTTP_GET_VARS[\'sessionid\'], 0, \'/\', \'\'); 
$HTTP_COOKIE_VARS[\'sessionid\'] = $HTTP_GET_VARS[\'sessionid\']; 
$sessionid = $HTTP_GET_VARS[\'sessionid\']; 


?> 

  一旦這個代碼運行之,一個全局的\'sessionid\'變量將可以用腳本。它將保存著用戶的cookie中的 
sessionid值,或者是通過GET請求發來的sessionid值。 


第二步:為所有的交叉域名引用使用變量 
  創建一個全局的配置文件,用存放可以進行切換的域名的基本引用形式。例如,如果我們擁有 
domain1.com和domain2.com,則如下設置: 

<?php 

$domains[\'domain1\'] = "http://www.domain1.com/-$sessionid-"; 
$domains[\'domain2\'] = "http://www.domain2.com/-$sessionid-"; 

?> 

  現在,如果在代碼中如下做: 

<?php 

echo "Click <a href=\"", $domains[\'domain2\'], "/contact/?email=yes\">here</a> to contact us."; 

?> 
  你將產生如下的輸出: 

Click <a href="http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes\">here</a> 
to contact us. 

  在這裡sessionid已經被插入到URL中去了。 

  在這個地方,你可能會想"這樣可能會在web服務器上打開名為橫線,sessionid,橫線的子目錄?!?!?"。 
然而,下面的步驟將提供一個必需的戲法,以便讓它能夠使用! 


第三步:配置Apache 
  現在,剩下的步驟就是配置apache來重寫這個URL: 

http://www.domain2.com/-66543afe6543asdf6asd-/contact/ 
  變成這樣: 

http://www.domain2.com/contact/?sessionid=66543afe6543asdf6asd 
  並且這種url: 

http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes 
  變成這樣: 

http://www.domain2.com/contact/?email=yes&sessionid=66543afe6543asdf6asd 
  為了實現它,簡單地配置兩個虛擬服務器,作為domain1和domain2,如下操作: 

<VirtualHost ipaddress> 
DocumentRoot /usr/local/www/domain1 
ServerName www.domain1.com 
RewriteEngine on 
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA] 
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA] 
</VirtualHost> 

<VirtualHost ipaddress> 
DocumentRoot /usr/local/www/domain2 
ServerName www.domain2.com 
RewriteEngine on 
RewriteRule ^/-(.*)-(.*\?.*)$ $2&sessionid=$1 [L,R,QSA] 
RewriteRule ^/-(.*)-(.*)$ $2?sessionid=$1 [L,R,QSA] 
</VirtualHost> 

  這些重寫的規則實現了上面兩個URL重寫的要求。 

結論 
  通過使用變量結合與apache的重寫功能,交叉域名cookie可以以一種簡單的方式實現。想要維護這樣的 
系統,無論什時候鏈接交叉域名,在使用域名變量之外,什也不用作了!在域名內部的鏈接不需要進行 
修改,因為cookie會工作正常。 

  如果你有興趣看一下在生產網絡中實際運作中的系統,請參觀http://www.familyhealth.com.au/。在 
一些交叉域名鏈接上移動你的鼠標,並且看一下當你點擊它們是如何被重寫的。 

  也許,使用這個技術唯一的問題就是無法刪除在用戶瀏覽器中的全部域名下的cookie。
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
CGI編程的COOKIE技術應用 (2001-08-24 07:00:00)
cookie模組 (2001-06-03 11:00:00)
 

★  樊強制作 歡迎分享  ★