文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>实现跨域的Cookie

实现跨域的Cookie

时间:2007-02-17  来源:PHP爱好者

Cookie是一项伟大的发明,允许网络开发员维护用户的登录状态。然而,当你的网站有多个域的时候就出现问题了。
Cookie的规范说明任何Cookie都只能在一个域中使用,而不能被送到任何其它的域。所以你在一个域中设的Cookie在其它域中是不可见的。如果你希望用户在一个域中登录即可访问其它域,这就成为了一个问题。
我的解决方案如下:
一段预设的程序将被用来从GET或COOKIE变量中接受sessionid,优先从GET变量中取得。这样,当我们需要跨域的联接时,sessionid可以通过URL变量传递。Apache的配置将会做一些修改以便重组URL。我们很快就会明白为什么要这样。

步骤1:预设一段程序
把下面的代码加到所有代码之前(或在所有代码之前的一个函数中)。
<?php
/* 支持跨域的cookies... */

// 如果GET中已有变量sessionid并且不等于cookie中的sessionid
// 则用GET中的sessionid(同时更新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或GET请求。

步骤2:为每个跨域的联接加上变量值
新建一个包含文件写入你需要切换的域的基地址。例如,如果你有domain1.com和domain2.com,写成这样:
<?php
$domains['domain1'] = "http://www.domain1.com/-$sessionid-";
$domains['domain2'] = "http://www.domain2.com/-$sessionid-";
?>
现在,如果你这样写代码:
<?php
echo "点击 <a href="", $domains['domain2'], "/contact/?email=yes">这里</a> 联系我们。";
?>
你将会得到以下的输出:
点击 <a href="http://www.domain2.com/-66543afe6543asdf6asd-/contact/?email=yes">这里</a> 联系我们。
sessionid已经被加在URL里了。
现在,你可能会想“这会试图打开Server上的-sessionid-目录?!”。不要着急,下一个步骤将为你提供必要的技巧。

步骤3:配置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
为了达到这个目的,只需要这样配置你的两个Server:
<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>
RewriteRule实现了上面的重写URL的要求。

结论
结合变量和Apache的重写机制,可以简单的实现跨域的cookie。当你的程序员需要做跨域联接时只需要使用domain变量就可以了。域内的联接就不需要这样做了。
如果你看看真实的例子的话,可以来这里:http://www.familyhealth.com.au/。
也许,这种技巧唯一的问题是在客户端要删除所有这些域的cookie时比较麻烦。
php爱好者站 http://www.phpfans.net php基础|php进阶|php模板.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载