找回密码
 FreeOZ用户注册
查看: 1786|回复: 18
打印 上一主题 下一主题

freeoz技术员请进

[复制链接]
跳转到指定楼层
1#
发表于 8-7-2008 18:59:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
我们的几个域名:http://www.freeoz.org,http://w1.freeoz.org...,为什么不把登陆的cookie信息配置成可在这几个域名里共享的功能;其实这几个域名都是解析到一台主机,但因为大家收藏的域名不同,变成有的时候点别人提供的链接时老是要重新登陆用户才能看到信息,不是很方便啊...

评分

参与人数 2威望 +60 收起 理由
NEWGAY + 30 牛人啊。
ubuntuhk + 30 谢谢提议!

查看全部评分

回复  

使用道具 举报

2#
发表于 9-7-2008 12:07:39 | 只看该作者

回复 #1 zeng_ap 的帖子

这个提议很好,因为我们几个技术员都不是搞web 编程出身的,所以还不知道cookie信息可以配置成几个域名共享。

我们会研究一下如何配置,如果有知道的同学,请不吝赐教。
回复  

使用道具 举报

3#
 楼主| 发表于 9-7-2008 13:03:05 | 只看该作者
是用apach+php做的web服务吗?
回复  

使用道具 举报

4#
 楼主| 发表于 9-7-2008 13:16:04 | 只看该作者
建议用apache+php引擎集成来做web服务会比较好,apache丰富灵活的配置,包含多域名解析、域名rewrite、cookie设置等
回复  

使用道具 举报

5#
 楼主| 发表于 9-7-2008 13:17:12 | 只看该作者
我这边找到一篇解决此问题的方法,供大家参考一下:
---------------------------------------------------------------------------------------
Coo

  在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对
一个域名设置了一个cookie,这个cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中
一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。


  我的解决方案将使用下面的一般框架:

一个预置的脚本将用来接受通过GET或COOKIE方式传递过来的sessionid号。它将比COOKIE优先选择GET
变量。所以,无论何时需要引用交叉的域名时,我们把sessionid做为一个URL参数进行发送。
修改Apache配置,用来实现重写所有的交叉域名的cookie。这样做的原因一会儿就会清楚了。
在任何时候出现一个交叉域名引用时使用变量。
第一步:创建预置脚本
  将下面的代码加到预置脚本中(或出现在所有脚本之前的函数中)。

<?php

/* 支持交叉域名cookie... */

// 如果GET变量已经设置了,并且它与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, \'/\', \'\'); 网管联盟bitsCN@com
$HTTP_COOKIE_VARS[\'sessionid\'] = $HTTP_GET_VARS[\'sessionid\'];
$sessionid = $HTTP_GET_VARS[\'sessionid\'];
}

?>

  一旦这个代码运行之后,一个全局的\'sessionid\'变量将可以用于脚本。它将保存着用户的cookie中的
sessionid值,或者是通过GET请求发来的sessionid值。


第二步:为所有的交叉域名引用使用变量
  创建一个全局的配置文件,用于存放可以进行切换的域名的基本引用形式。例如,如果我们拥有
domain1.com和domain2.com,则如下设置:

<?php

$domains['domain1\'] = "http://www.domain1.com/-$sessionid-";
网管下载dl.bitscn.com


$domains[\'domain2\'] = "http://www.domain2.com/-$sessionid-";

?>

  现在,如果在代码中如下做:

<?php

echo "Click <a href=\"", $domains['domain2\'], "/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/? ... 6543afe6543asdf6asd
  为了实现它,简单地配置两个虚拟服务器,作为domain1和domain2,如下操作:

<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> 中国网管论坛bbs.bitsCN.com

<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>

  这些重写的规则实现了上面两个URL重写的要求。

结论
  通过使用变量结合与apache的重写功能,交叉域名cookie可以以一种简单的方式实现。想要维护这样的
系统,无论什么时候链接交叉域名,在使用域名变量之外,什么也不用作了!在域名内部的链接不需要进行
修改,因为cookie会工作正常。

  如果你有兴趣看一下在生产网络中实际运作中的系统,请参观http://www.familyhealth.com.au/。在
一些交叉域名链接上移动你的鼠标,并且看一下当你点击后它们是如何被重写的。

  也许,使用这个技术唯一的问题就是无法删除在用户浏览器中的全部域名下的cookie。
回复  

使用道具 举报

6#
 楼主| 发表于 9-7-2008 13:27:49 | 只看该作者
另外一种解决方法也摘抄过来......
----------------------------------------------------------------------

跨域(cross-domain)访问 cookie (读取和设置)
2008-02-26 10:36:09 / 个人分类:Cookie跨域

Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去。坦白说,目前 sohu passport 在这一点实现的很烂(不过俺的工作就是要把它做好啦,hehe)搜狐的 SSO 需求比较麻烦,因为它旗下有好多域名:sohu.com、chinaren.com、sogou.com、focus.cn、17173.com、go2map.com,登录用户漫游的主要障碍也来自于此。以前亿邮的邮件系统在和别的系统整合的时候是提供一个 URL,用户从第三方系统里面点击这个链接就可以生成访问邮件界面所需的 cookie,然后进入邮件。这个方式的确很有效,但问题是:PHPChina 开源社区门户"D ZP*]y} a
1. 每个外部链接都必须用特殊的 URL 跳转,维护很麻烦PHPChina 开源社区门户me? Z(pQz%j F
2. 两个系统集成已经很麻烦了,若是集成的系统有好几个,彼此都需要跳转而缺乏一个中心机制就成了噩梦PHPChina 开源社区门户^LD-z%^8o
3. 根本无法处理用户直接在地址栏输入地址进行访问的情况

即使是跨域,上述的解决方法相对来说还是容易的。
}]~6zK4Y[9g0A. 首先是所有登录必须首先通过一个中央服务器进行认证,然后在它那里给浏览器种下 cookie(下面称之为 sso cookie)
T(w5d"vjWx3yS0B. 当用户访问另外的域名 app 的时候,浏览器是无法直接发送 sso cookie 给服务器认证的。此时应该利用 javascrīpt,动态创建一个隐藏的 iframe,让其访问 sso
6H C;^;Xtuc0C. 这个 iframe 的请求是可以把 sso cookie 送给 sso server 的。sso server 验证 cookie 后,返回一个重定向页面到 app 的某个 URL,由该 URL 设置 app cookiePHPChina 开源社区门户:]!^)E6f/@v#G;Y6Y
D. 此时浏览器上可看见的页面容器实际上也是可以和重定向回来的内容交互的。比如可以用 js 控制发现重定向页面成功返回后,就刷新整个页面,让它看起来和用户登录后访问没有什么区别。

下面是真正的技巧:怎样才能在 IE 里面跨域去设置 cookiePHPChina 开源社区门户` l.Ck)U,jZ`y
上述技术看起来是不是很好?但它的前提是所有的登录都 post 到 sso server 上,认证成功后再返回 app 页面。可我接受到的需求之一就是要支持页面无刷新登录。哈!就是说本来在 chinaren.com 上提交登录表单的 action 应该是 passport.sohu.com 这个 sso server。可是在 AJAX 大潮下,chinaren 计划采用 XMLHTTPRequest 提交,这个就麻烦了,因为是不能跨域来提交的。那么解决方法就是跨域产生 cookie,即 js 发现口令校验成功后,再在 passport.sohu.com 上种上合法的 cookie.套用上面的跨域读 cookie 的方案似乎很简单去推论:就是创建一个隐含的 iframe,让那个 iframe 去调用 passport.sohu.com 的 URL 来产生 cookie。很遗憾,此方法在 Fx 下工作的很好,但是不能在 IE 上应用。(在 IE 状态栏上显示 cookie 隐私警告,红色圆底白横杠)我试了很多很多方法,包括创建 、 node,包括用 js 设置,但都一次次被 IE 无情的挡在了浏览器外。google 之,也没有任何真正可用的答案,中文网页要么介绍的方法是错的,要么说无解。最后还是在 chinaren 一哥们的帮助下,翻出了他们所使用的,以和 alumni.sohu.com 交互的方法(不知道是哪位牛人发现的),只需要设置 P3P HTTP Header,在隐含 iframe 里面跨域设置 cookie 就可以成功。他们所用的内容是:


CC-j`r/P:` R0
P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"


T l9Xj,B1}2Nk@0
最后是我做的一个小小的演示:cookie 怎么在 vmx.cn 和 dup2.net 之间交互

PHPChina 开源社区门户7yPs3B \%@R+h3[&E p;E

1. http://qiuyingbo.test.vmx.cn/cookie.php

PHPChina 开源社区门户I3{ \S$v)Od V]

2. 随便输入什么,点 reset cookie,就可以看到 vmx.cn 的 cookie 已经被设上了

PHPChina 开源社区门户Mp T?B9vV1u\O

3. 在该页面点连接到 http://www.dup2.net/vmx/cookie.html

4. 点"get corss-domain cookie" .. (此时 js 会去创建一个iframe,请求 qiuyingbo.test.vmx.cn ,返回页面把 cookie 值作为 GET 参数重定向回 dup2.net 的另外一个URL。)

5. 点 "display corss-domain cookie" .. 就可以看到 vmx.cn 的 cookie 了6. 在该页面的输入框中输入其它的值,然后点 "set cross-domain cookiea",该行为将主动设置 vmx.cn 的 cookie

7. 点链接回到 http://qiuyingbo.test.vmx.cn/cookie.php ,就可以看到新的值了

<iframe width=0 height=0 id="refleshcookieby1home" src="http://www.tianya.cn/cookie/refleshonlineby1home.asp?idwriter=<%=idWriter%>&key=<%=key%>&strwriter=<%=strWriter%>">
回复  

使用道具 举报

7#
发表于 9-7-2008 13:31:52 | 只看该作者
提示: 作者被禁止或删除, 无法发言
太复杂了吧?
回复  

使用道具 举报

8#
发表于 9-7-2008 14:16:16 | 只看该作者
论坛是apache+php架构,不过上面两个方案确实都挺复杂的
回复  

使用道具 举报

9#
 楼主| 发表于 9-7-2008 14:30:13 | 只看该作者


不好意思,我发现我们的域名其实可以用泛域名(*.freeoz.org)的方式来写,上面两种方案是针对不同根域名的解决方案(比如 www.aaa.comwww.bbb.com
你只要在cookie写入的时候domain写成这样就行了,可以试试看:
Response.Cookies("MyCookie").Domain = "freeoz.org"; (不要写成www.freeoz.org 或 w1.freeoz.org)
Response.Cookies("MyCookie").Path = "/" (加这句是可以做到不同的虚拟目录也可以共享cookie)

试试这种写法实现cookie跨域跨目录, 有不足之处望指正
回复  

使用道具 举报

10#
 楼主| 发表于 9-7-2008 14:35:16 | 只看该作者
这版怎么不能编辑帖子!!

上面freeoz.org前要加个点
Response.Cookies("MyCookie").Domain = ".freeoz.org"; (不要写成www.freeoz.org 或 w1.freeoz.org)
Response.Cookies("MyCookie").Path = "/" (加这句是可以做到不同的虚拟目录也可以共享cookie)

(要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为 '.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。如果该参数设为 www.example.com 的话,就只在 www 子域内有效。)

评分

参与人数 1威望 +30 收起 理由
ubuntuhk + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

11#
发表于 9-7-2008 16:11:57 | 只看该作者
提示: 作者被禁止或删除, 无法发言
一般人收藏的域名主要有两个 freeoz.org 和 freeoz.biz
所以上面的同域的方法意义不大。
回复  

使用道具 举报

12#
发表于 9-7-2008 16:31:52 | 只看该作者

回复 #10 zeng_ap 的帖子

freeoz.org的设置好了,确实如xblues说的,我们还有freeoz.biz域名,这个不知道能不能一起设置了。
回复  

使用道具 举报

13#
发表于 9-7-2008 16:37:54 | 只看该作者

回复 #12 ubuntuhk 的帖子

对了,这样设置之后,freeoz.biz可能就登录不了了。

我还是暂时取消这个设置吧。
回复  

使用道具 举报

14#
发表于 9-7-2008 16:55:04 | 只看该作者
谢谢建议,LZ技术很牛  

不过freeoz.org和freeoz.biz做跨域cookie共享的话会不会有安全上的风险? 我不知道,有空研究一下。
回复  

使用道具 举报

15#
 楼主| 发表于 9-7-2008 18:01:49 | 只看该作者
原帖由 ubuntuhk 于 9-7-2008 16:37 发表
对了,这样设置之后,freeoz.biz可能就登录不了了。

我还是暂时取消这个设置吧。


可以的啊,www.freeoz.biz 你就做指向www.freeoz.org,不是做域名解析到58.221.33.117,这样在域名管理中把www.freeoz.biz指向任何一个 *.freeoz.org就行了...
回复  

使用道具 举报

16#
发表于 9-7-2008 19:24:48 | 只看该作者

回复 #15 zeng_ap 的帖子

呵呵,有道理,赞~~
回复  

使用道具 举报

17#
发表于 10-7-2008 14:19:33 | 只看该作者
BIZ不是已经没有了吗???
回复  

使用道具 举报

18#
发表于 10-7-2008 21:28:54 | 只看该作者

回复 #17 mite 的帖子

biz有的,作为org的备份域名。
回复  

使用道具 举报

19#
发表于 18-7-2008 11:10:04 | 只看该作者
看来我要多学习FREEOZ的历史!原来还有那么多域名。
对不起,不是管理员也来凑热闹!
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 3-8-2026 09:39 , Processed in 0.023302 second(s), 39 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表