分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程PHP专区 → 文章内容

实现跨域的Cookie

  • 作者:佚名    来源:不详    发布时间:2006-2-26 2:03:56
  • 字体大小:
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时比较麻烦。
<