實(shí)現(xiàn)跨域名Cookie
Jun 21, 2016 am 09:14 AMcookie
Cookie真是一個(gè)偉大的發(fā)明,它允許web開(kāi)發(fā)者保留他們的用戶的登錄狀態(tài)。然而,當(dāng)你的站點(diǎn)或網(wǎng)絡(luò)
有一個(gè)以上的域名時(shí)就會(huì)出現(xiàn)問(wèn)題了。
在Cookie規(guī)范上說(shuō),一個(gè)cookie只能用于一個(gè)域名,不能夠發(fā)給其它的域名。因此,如果在瀏覽器中對(duì)
一個(gè)域名設(shè)置了一個(gè)cookie,這個(gè)cookie對(duì)于其它的域名將無(wú)效。如果你想讓你的用戶從你的站點(diǎn)中的其中
一個(gè)進(jìn)行登錄,同時(shí)也可以在其它域名上進(jìn)行登錄,這可真是一個(gè)大難題。
我的解決方案將使用下面的一般框架:
一個(gè)預(yù)置的腳本將用來(lái)接受通過(guò)GET或COOKIE方式傳遞過(guò)來(lái)的sessionid號(hào)。它將比COOKIE優(yōu)先選擇GET
變量。所以,無(wú)論何時(shí)需要引用交叉的域名時(shí),我們把sessionid做為一個(gè)URL參數(shù)進(jìn)行發(fā)送。
修改Apache配置,用來(lái)實(shí)現(xiàn)重寫(xiě)所有的交叉域名的cookie。這樣做的原因一會(huì)兒就會(huì)清楚了。
在任何時(shí)候出現(xiàn)一個(gè)交叉域名引用時(shí)使用變量。
第一步:創(chuàng)建預(yù)置腳本
將下面的代碼加到預(yù)置腳本中(或出現(xiàn)在所有腳本之前的函數(shù)中)。
/* 支持交叉域名cookie... */
// 如果GET變量已經(jīng)設(shè)置了,并且它與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'];
}
?>
一旦這個(gè)代碼運(yùn)行之后,一個(gè)全局的'sessionid'變量將可以用于腳本。它將保存著用戶的cookie中的
sessionid值,或者是通過(guò)GET請(qǐng)求發(fā)來(lái)的sessionid值。
第二步:為所有的交叉域名引用使用變量
創(chuàng)建一個(gè)全局的配置文件,用于存放可以進(jìn)行切換的域名的基本引用形式。例如,如果我們擁有
domain1.com和domain2.com,則如下設(shè)置:
$domains['domain1'] = "http://www.domain1.com/-$sessionid-";
$domains['domain2'] = "http://www.domain2.com/-$sessionid-";
?>
現(xiàn)在,如果在代碼中如下做:
echo "Click here to contact us.";
?>
你將產(chǎn)生如下的輸出:
Click here
to contact us.
在這里sessionid已經(jīng)被插入到URL中去了。
在這個(gè)地方,你可能會(huì)想"這樣可能會(huì)在web服務(wù)器上打開(kāi)名為橫線,sessionid,橫線的子目錄?!?!?"。
然而,下面的步驟將提供一個(gè)必需的戲法,以便讓它能夠使用!
第三步:配置Apache
現(xiàn)在,剩下的步驟就是配置apache來(lái)重寫(xiě)這個(gè)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
為了實(shí)現(xiàn)它,簡(jiǎn)單地配置兩個(gè)虛擬服務(wù)器,作為domain1和domain2,如下操作:
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]
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]
這些重寫(xiě)的規(guī)則實(shí)現(xiàn)了上面兩個(gè)URL重寫(xiě)的要求。
結(jié)論
通過(guò)使用變量結(jié)合與apache的重寫(xiě)功能,交叉域名cookie可以以一種簡(jiǎn)單的方式實(shí)現(xiàn)。想要維護(hù)這樣的
系統(tǒng),無(wú)論什么時(shí)候鏈接交叉域名,在使用域名變量之外,什么也不用作了!在域名內(nèi)部的鏈接不需要進(jìn)行
修改,因?yàn)閏ookie會(huì)工作正常。
如果你有興趣看一下在生產(chǎn)網(wǎng)絡(luò)中實(shí)際運(yùn)作中的系統(tǒng),請(qǐng)參觀http://www.familyhealth.com.au/。在
一些交叉域名鏈接上移動(dòng)你的鼠標(biāo),并且看一下當(dāng)你點(diǎn)擊后它們是如何被重寫(xiě)的。
也許,使用這個(gè)技術(shù)唯一的問(wèn)題就是無(wú)法刪除在用戶瀏覽器中的全部域名下的cookie。

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

??? ????? ????? ?? ??? ????, ????? ?? ??? ????? ???? ?? SQLite ???? ?????. ?? ??? ?? ?? ?? ????? ?? ? ?? ??? ??? ? ???? ???? ?? ?? ????. ??? ?? ???? ?? ??? ?????? ???? ?? ?? ?????.

???? ??? ??? ???? ? ?? ??? ?? ????? ?? ??? ?????. 1. Google Chrome, C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data\Default\Cookies? ??? ?.

HTTP 301 ?? ??? ?? ??: ? ??? ????? ???? ?? ???? ???? ??? ???? ?? ???? ? ??? ?? ??? ?? ?? ??? ?? ? ???? ????. ? ??? ???? ? ??? ????? HTTP 301 ?? ??? ?? ???? ????? ??? ?????. ? ????? HTTP 301 ?? ??? ??? ? ??? ????? ???? ?? ???? ????? ?????. HTTP301 ?? ??? ?? ????(PermanentRedirect)? ?????. ??? ?????? ??? ?? ?

HTTP ?? ?? 200: ???? ??? ??? ?? ?? HTTP ?? ??? ?? ?? ??? ???? ? ???? ?? ?????. ? ? ?? ?? 200? ??? ??? ?? ????? ?????? ?????. ? ????? HTTP ?? ?? 200? ???? ??? ???? ???????. ?? HTTP ?? ??? ??? ??? ?????. ?? ??? 1xx, 2xx, 3xx, 4xx ? 5xx? ?? ?? ??? ????. ? ? 2xx? ???? ??? ?????. ??? 200? 2xx?? ?? ???? ?? ?????.

???? ??? ??? ??? ???? ??????? ?????. 1. iOS ??? ?? ??? Safari ????? ?? -> Safari -> ?? -> ???? ???? ?????. 2. Android ??? ?? ??? ?????. ?? -> ??? ?? -> ?? ????? ?? ???

HTTP ?? ?? 404? ??? ?? ??? ?????. ??: ?? ???? ???? HTTP ?? ?? 404? ?? ??? ???. ? ?? ??? ??? ??? ???? ?? ? ??? ?????. ? ???? HTTP ?? ?? 404? ??? ???? ? ?? ?? ??? ???????. 1. HTTP ?? ?? 404? ??: 1.1 ???? ???? ????. ?? ???? ??? ??? ???? ??? ???? ?? ?????. ?? ??? ??? ?????, ??? ?????, ??? ?? ???? ??? ?? ??? ? ????.

C++?? HTTP ????? ???? ??? ?????? Boost.Asio ? asiohttps ????? ?????? ???? SSL ??? ??? ?????. ??? ???? HTTP ??? ????. HTTP ?? ??? ???? ?????. HTTP ?? ??? ???? ?????.

??? ?? ???? ???? ????? ?? ??? ?????. ??? ??? ???? ?? ??, ?? ?? ? ?? ??? ???? ?? ??? ?????. ? ??? ?????? ? ?? ???? ???? ?? ??? ? ????. ??? ??? ??? ???? ?? ?? ?? ??? ??? ? ?? ????. ???? ?????? ??? ??? ?? ? ????? ?? ??? ??? ??? ???? ???. ??????
