用户
 找回密码
 入住 CI 中国社区
搜索
查看: 32318|回复: 52
收起左侧

[会话/Cookie] 关于ci的session的在ie下失效的,原因研究

    [复制链接]
发表于 2011-6-12 21:34:02 | 显示全部楼层 |阅读模式

很久以前就发现了这个问题,ci的session在ie下会有莫名其妙的问题,有的时候莫名其妙就丢失了。

但偶然又会正常,到网上查了n多的资料,大家都觉得是ci的session处理有问题,我也觉得是这样,所以一直在

找一个合适的第三方扩展,试过了ci wiki上提到的主要的扩展,结果都没有改善。我觉得很纳闷,按理说这么一

明显的问题,ci的开发团队不可能就没点动静,心中甚是不解啊。

我当初以为是客户端的浏览器的cookie设置的原因,应为在大多数情况下,火狐浏览器是没问题的,而ie下

就出现丢失现象,于是我觉得用php原生的session加上数据库应该没问题了吧,于是,我参照那些第三方扩展

想将session中的关于涉及到cooki的操作,去掉,取代用php原生的session,可是奇怪的是,效果任然不明显

我查看数据库中的ci_sessions数据表,发现一件很奇怪的事情:在ie下只要一刷新页面,就会添加多条session记录

而在火狐下打开同一个站点,不管怎么刷新,都只会有同一条记录,不会出现多条。至此我就更加郁闷了,怎么会有这种情况呢!

我百思不得其解,我以为是ci的在调用的session的时候,多次进行了创建,于是我新建一个简单的页面,想脱离开ci框架测试php

原生的session,这个时候我才发现,我调用session_id(),想输出session_id值,结果发现,在ie下每刷新一次页面session_id

就改变一次,而在火狐下却不管怎么刷新始终是一个值。我就更纳闷了,难道php都和ie有"隔阂",这怎么可能。

于是我开始在网上检索关于"ie下session失效的案例",无意之中我注意到

        RFC 952规定在域名中不能出现"_" , 在使用中,应尽量避免这种情况。
       
        有网友也说明该问题也会影响到session的效果
       
        于是我修改虚拟站点的域名,将"_"去掉后,很显然,一切正常了。
       
所以我觉得关于session的问题并不是ci框架本身的问题,应该是我们细节上的问题,还有就是遵循标准时很重要的,否则

只能瞎郁闷!

评分

参与人数 5威望 +19 收起 理由
沙琪玛 + 5 很给力!
avinmo + 1 赞一个!
IT不倒翁 + 5 这个很重要的,重点是解决问题的思路.
Hex + 5 很给力!
jeongee + 3 赞一个!

查看全部评分

发表于 2014-8-30 11:50:24 | 显示全部楼层
新项目正好碰到,本地用IP测试都没问题,传到测试服务器域名有下划线,IE就出现多条session,原来是这么回事。
发表于 2014-6-13 11:42:14 | 显示全部楼层
这个问题 我确实没怎么注意 多谢楼主的提醒啊
发表于 2014-6-9 15:24:23 | 显示全部楼层
有过和楼主类似的经历。楼主总结的很好,赞
发表于 2011-6-12 21:52:26 | 显示全部楼层
好帖子,原来是这样
发表于 2011-6-13 10:06:30 | 显示全部楼层
原来是这样,感谢~~
发表于 2011-6-13 13:56:16 | 显示全部楼层
还好我没有在域名里添加下划线的习惯
发表于 2011-6-13 14:27:07 | 显示全部楼层
注册域名的时候. 是不让用下划线的- -!!  但是.. 二级域名可以用- - ..
发表于 2011-6-13 16:14:06 | 显示全部楼层
本帖最后由 smartweb 于 2011-6-13 16:15 编辑

和Disallowed Key Characters 一个原理,是下横线的原因。我还改了\system\core\Input.php
但有人说只要改/application/config/config.php,将
‘ci_session’;改成‘c-session’;即可这个我是上CI英文官网问过的,还作为BUG提交,但我没办法试,反正我电脑没事。。。。。。。
 楼主| 发表于 2011-6-13 19:59:38 | 显示全部楼层
smartweb 发表于 2011-6-13 16:14
和Disallowed Key Characters 一个原理,是下横线的原因。我还改了\system\core\Input.php
但有人说只要改/ ...

经过测试,修改config.php中的ci_session并没有起作用。

当然我想把"ci_session"改成"ci-session"是有一定道理的,应为有文献表明,在域名中不是不允许出现"_"的,

这里提到的"ci_session"是ci配置文件中的"sess_cookie_name"的值,也就是cooki的名字,不出现"_"应该也有

说明"_"可能是一个不允许出现的字符,毕竟它确实不是一个常用的命名字符。

然而我在测试中有脱离过ci直接测试php的session的,问题根源依旧是域名的问题,这个和ci是不相关的,

我猜测可能是因为域名中出现了"_",导致在解析的时候异常,不能正确提取header信息,导致出现随机的

结果,使得会话失去连贯性,于是浏览器或者服务器放认为每次刷新,都是一个完全新的请求(不是和开始是一

个会话状态),但是鉴于在火狐下却一切正常,可见这和浏览器是有原因的(也许不是全部的原因),应该

仍然是对header信息的处理问题上!这个属于个人猜想,并没有找到可靠的证据。

而且现在的域名申请中式不允许出现"_"的,所以一般在部署好的服务器上因该出现问题的概率不大,倒是在

自己机器上调试时候,由于往往有多个项目的存在,通常都会命名一个简短好记的虚拟站点域名,这才会有

这个问题的出现。
发表于 2011-6-13 20:48:46 CI中国手机版 | 显示全部楼层
我以前有个站,在url里传递一个包含有_的变量,结果得不到,最后才发现,就和楼主说的差不多吧
 楼主| 发表于 2011-6-13 21:44:11 | 显示全部楼层
xushre 发表于 2011-6-13 20:48
我以前有个站,在url里传递一个包含有_的变量,结果得不到,最后才发现,就和楼主说的差不多吧 ...

"_"下划线只是不允许在域名中出现,并没有规定说url中的参数或者站点的目录,以及文件名字中不能出现"_",

经过测试在单纯的php环境下变量名中含有下滑线,只要是合法的变量名,都是能过获取的。可能是你使用了框架

吧,很多框架对url有编码的要求,也有会将一些特殊的字符过滤或者替换掉。这样做也许是避免一些所谓的

莫名奇妙的"灵异事件"吧,呵呵!
发表于 2011-6-14 12:07:09 | 显示全部楼层
那我不知道了,反正用IE就取不到,但FF好像可以,记得不太清了哈

本版积分规则