我們?cè)诰W(wǎng)站上經(jīng)常會(huì)看到一些需要登錄才能訪問的頁面或者功能。這些功能很大程度上依賴于瀏覽器的 cookies。對(duì)于普通的網(wǎng)站,cookie 是一種很好用的機(jī)制,但是在跨域場景下,cookie 就會(huì)變得不太好用。以下是關(guān)于 PHP cookies 跨域的介紹。
對(duì)于了解 cookies 的人來說,可以跳過下面的部分,直接來看 cookies 在跨域場景下的問題。對(duì)于對(duì) cookies 不了解的人,可以簡單了解一下 cookies 的原理。cookies 是一種服務(wù)器下發(fā)到客戶端的數(shù)據(jù)存儲(chǔ)機(jī)制,存放在客戶端的瀏覽器緩存中。通過傳遞 cookies,服務(wù)器可以識(shí)別客戶端,從而實(shí)現(xiàn)各種操作,比如記錄用戶認(rèn)證信息、購物車信息等等。
在單域名場景下,cookies 利用的是同源機(jī)制來達(dá)到其目的,而在跨域場景下,不能直接使用 cookies。讓我們來看一個(gè)例子:
// 假設(shè)我們有兩個(gè)域名 http://www.domain.com 和 http://www.google.com // 在 www.domain.com 下,我們?cè)O(shè)置了一個(gè) cookies,內(nèi)容為 name=test setcookie('name', 'test', time()+3600, '/', 'www.domain.com'); // 在 www.google.com 下,我們想要讀取 www.domain.com 下的 cookies,看看是否可以讀到 echo $_COOKIE['name'];
上述代碼在跨域場景下肯定是不能正常工作的。因?yàn)橄驗(yàn)g覽器發(fā)出 cookie 的服務(wù)器是 www.domain.com,而不是 www.google.com,因此這里讀取的 cookies 實(shí)際上是沒有的。在跨域場景下,我們可以通過以下機(jī)制來實(shí)現(xiàn)同樣的功能。
跨域通信的常用方式有多種,例如使用 JSONP、CORS 等技術(shù)。在這篇文章中,我們介紹一種通過 URL 參數(shù)傳遞數(shù)據(jù)的方法。我們可以在 URL 中附加參數(shù),將需要傳遞的數(shù)據(jù)放入?yún)?shù)中。這樣,我們就可以實(shí)現(xiàn)同樣的功能了。
// 假設(shè)我們有兩個(gè)域名 http://www.domain.com 和 http://www.google.com // 在 www.domain.com 下,我們?cè)O(shè)置了一個(gè) cookies,內(nèi)容為 name=test setcookie('name', 'test', time()+3600, '/', 'www.domain.com'); // 在 www.google.com 下,我們?cè)?URL 中附加參數(shù) name=test,然后在后端將其解析到 $_GET 中來獲取 echo $_GET['name'];
盡管這種方式能夠?qū)崿F(xiàn)跨域通信,但是也要注意一些安全問題。如果你需要將一些敏感數(shù)據(jù)通過 URL 參數(shù)傳遞,那么就有被截取的風(fēng)險(xiǎn)。因此在實(shí)現(xiàn)的時(shí)候需要謹(jǐn)慎處理。以上是關(guān)于 PHP cookies 跨域的介紹。希望能對(duì)你有所幫助。