php實現跨域名Cookie

Cookie 真是一個偉大的發明,它允許 web 開發者保留他們的用戶的登錄狀態。然而,當你的站點或網絡有一個以上的域名時就會出現問題了。

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

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

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

第一步:創建預置腳本

將下面的代碼加到預置腳本中(或出現在所有腳本之前的函數中)。

<?php/*

支持交叉域名cookie...



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

<?phpecho "Click <a href="". $domains[Array;domain2Array;]. "/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/domain1ServerName www.domain1.comRewriteEngine onRewriteRule ^/-(.*)-(.*?.*)$ &sessionid= [L,R,QSA]RewriteRule ^/-(.*)-(.*)$ ?sessionid= [L,R,QSA]</VirtualHost><VirtualHost ipaddress>DocumentRoot /usr/local/www/domain2ServerName www.domain2.comRewriteEngine onRewriteRule ^/-(.*)-(.*?.*)$ &sessionid= [L,R,QSA]RewriteRule ^/-(.*)-(.*)$ ?sessionid= [L,R,QSA]</VirtualHost>

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



結論

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

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

也許,使用這個技術唯一的問題就是無法刪除在用戶瀏覽器中的全部域名下的 cookie。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章