开启目录形式的 urlrewrite session出问题了!
发布于:2022-01-17 09:50:54
#1 anythink
配置如下
'spUrlRewrite' => array(
'hide_default' => true, // 隐藏默认的main/index名称,但这前提是需要隐藏的默认动作是无GET参数的
'args_path_info' => false,
'suffix' => '',
'sep' =>'/',
某些页面下会丢失部分session 不知道是什么问题。
该贴已经同步到 anythink的微博
2011-10-08 14:44:15
#2 anythink
'sep' =>'-',
恢复后就一点问题没有
2011-10-08 16:32:29
#3 jake
session是依赖cookie的,注意配置cookie的作用域
http://cn.php.net/manual/zh/session.configuration.phpcookie_path
cookie_domain
2011-10-08 20:16:32
#4 anythink
回复 3 jake 我服务器上的 [table]
[tr][td]session.cookie_path[/td][td]"/"[/td][td]PHP_INI_ALL[/td][/tr]
[/table]
写的就是 /
难道是不行的???
只要变成 add/id/83 这样的 session 就丢失一部分.....
2011-10-09 00:36:11
#5 anythink
回复 3 jake 难道 cookie_domain 也必须得设置才可以???
2011-10-09 00:38:53
#6 jake
“丢失一部分”?SESSION ID改变吗?主要是看SESSION ID的值有无改变,SESSION ID会存在COOKIE的。
2011-10-09 07:44:35
#7 anythink
回复 6 jake session id 并没有改变,而是我新增的 session值,$_SESSION['tempid']
http://192.168.0.200/yunbian/edit/id/94.html 这样的访问方式,当前页面print_r($_SESSION) 有,但是提交后,下一个页面 就没了
仅仅是这种地址会消失 tempid ,而登陆信息却还在。
2011-10-09 09:31:08
#8 jake
提交了之后,session id也是一样吗?
session id的作用相信你也知道,那是每个会话唯一的存储文件的文件名,只要这个文件名没有改变,那么文件名里面的存储值就还是相同的。
所以,在session id相同的情况下,SESSION是没有“丢失值”的问题,当然过期是不再保存。
session id如果一直都是同一个,那么只能是检查是否有什么地方改变了session里面的值。可以监视一下session的存储文件夹,看里面产生的文件和内容。
2011-10-09 09:41:23
#9 anythink
回复 8 jake 你是说session 值丢失 不是 /xx/xxx/xx 这种url 方式所造成的?
那为什么换成xx-xxx-xx.html 就没问题呢... 奇怪.......
2011-10-09 09:59:44
#10 anythink
回复 8 jake 这是代码片段,我加了print_r
这是编辑时,id通过处理写入session中。并且当页可以看到。
这是 提交时,session值 就丢一个。。。。。
2011-10-09 10:09:44
#11 jake
只丢一个值,session其他值不受影响,不觉得奇怪吗?
再建议你换一个方式找问题(最好能按我建议的方式做一下,否则提问也没意义了对吗)
在入口文件spRun之前print出session,而不是在程序走完了再print,应该可以看到更多问题。
2011-10-09 10:54:47
#12 anythink
回复 11 jake 试了很久。 只要开着
//'router_prefilter' => array( array('spUrlRewrite', 'setReWrite') ),
//'function_url' => array( array("spUrlRewrite", "getReWrite"), ),
就不行
而且是 我只要手动输入的字符 就可以 变量就不行。。。。。
2011-10-09 18:12:12
#13 anythink
回复 11 jake 不知道啥原因,我一直追踪到smarty模板这块
// display or fetch
if ($display) {
if ($this->caching && $this->cache_modified_check) {
$_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
if ($_isCached && $_gmt_mtime == $_last_modified_date) {
if (php_sapi_name() == 'cgi')
header('Status: 304 Not Modified');
else
header('HTTP/1.1 304 Not Modified');
} else {
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT');
echo $_output;
}
} else {
echo $_output; //<------------------------------只要一echo session 刷新就没了,如果不echo 把诊断代码放到前面并exit。session的那个值就会存在
//////////////////////////////////////////
echo session_id();
echo var_dump($_SESSION);
exit;
/////////////////////////////////////////
}
// de output
if ($this->de ging) {
Smarty_Internal_De ::display_de ($this);
}
return;
} else {
// return fetched content
return $_output;
}
}
2011-10-09 19:06:01
#14 jake
换个名字,加多几个session看看。
session丢失要么一起没了,没有理由是某些丢了,这个在PHP来说是很难理解的。
入口文件测试,不要spRun,每次都输出看看。
2011-10-09 20:34:18
#15 anythink
回复 14 jake 换个名字,加多几个session看看。 没错,这个方法我已近试过了。 我也在 spRun 之前 测试了。
session丢失要么一起没了,没有理由是某些丢了,这个在PHP来说是很难理解的。 你说的没错。。。。 所以我已经郁闷了很久了。。。。。
现在的情况是,不关我用原来的tempid还是我给一个测试testid, 只要我 写 $_SESSION['testid'] = '213123213'; 就可以一直传递。 就是我给一个非变量
如果我写成 $_SESSION['testid'] = $result['bid']; 只有设置的时候刷新,页面上显示有值,但是session文件却没有,所以当我继续刷新。 spRun 之前的位置 还是没有显示session的值。而第一种方法却可以。。。。。 这也是我很奇怪的地方。 最主要的是 $result['bid']; 确实存在也确实有值!
2011-10-09 22:47:35
#16 jake
有没有打开session文件看过,每个浏览器会话只会产生一个session文件,而文件的内容就是session的值,可以看看每次操作文件里面的值的变化。
我觉得应该是赋值的问题,用变量赋值给session也不一定每次都有值,或者变量已经被改变。
你可以不用$_SESSION['testid'] = $result['bid'];,而用
$abc = 100;
$_SESSION['myabc'] = $abc;
这样来做,因为$result之类的,应该是从数据库读出来的。上面的方法如果行得通,再继续找原因下去,而不是每次都要扯上数据库等一堆的操作再来找问题。
2011-10-09 23:04:46
#17 anythink
回复 16 jake 是啊 我打开session文件了, 写入的过程在session数组里看似有了。其实文件内的那个session值实际还是空。我一直在追踪sessionID和session文件的变化。
$abc = 100;
$_SESSION['myabc'] = $abc;
我用这种方式赋值是成功的,能够正常传递。
但是使用数据库资源就继续成空......................
2011-10-10 10:30:42
#18 jake
那问题并非session,而是数据库资源在某个地方或者经过什么操作之后变成了空。
2011-10-10 10:37:05
#19 anythink
回复 18 jake $bid = $ras['bid'];
$_SESSION['tempid'] = $bid;
echo $bid;
数据库取过来是有值的 ,那个93就是啊!!!!
Array ( [uid] => 4 [email] => nxfte@qq.com [domain] => anythink [username] => 幻の羽翼 [admin] => 1 [openconnect] => Array ( [WEIB] => Array ( ) [pmsend] => Array ( [17] => 1318147350 ) [tempid] => [tempbid] => [testid] => 333 ) 93
2011-10-10 11:04:05
#20 anythink
回复 18 jake 能否加个友 我把系统整个发给你,帮忙de 一下....
2011-10-10 11:32:23
#21 anythink
回复 18 jake 不加就不加吧..再帮忙分析一下么...
2011-10-11 10:10:45
#22 jake
不要想着在你现在的程序里面调试,而是从最简单的执行路径开始,一步步增加代码再找问题。
2011-10-11 12:25:07
#23 anythink
哎我已经彻底无语了。。。。。。。。
2011-10-12 11:21:27
#24 jake
哎我已经彻底无语了。。。。。。。。
anythink 发表于 2011-10-12 11:21
发我QQ号吧。
2011-10-12 12:13:23
#25 anythink
回复 24 jake 这个问题已经解决了, 是因为 rewrite 会把 404 转向到 框架404页面,导致提前输出了内容,所以session丢失。
建议在rewrite这块进行一下处理
2011-11-08 09:54:57
#26 jake
回复 jake
这个问题已经解决了, 是因为 rewrite 会把 404 转向到 框架404页面,导致提前输出了内 ...
anythink 发表于 2011-11-8 09:54
框架没有404页面,而且也不会转向404之后再显示别的内容。
检查你的页面逻辑吧。
2011-11-08 10:50:26
#28 jake
再看看你前面发的代码,我大概知道是什么问题了
因为页面上访问了那两个不存在的页面,而你的程序在那两个页面改写了session里面的tempid,所以最后导致这个tempid在后面的页面就不见了。
这个问题很容易解决,在不存在的页面那里,首先判断用户名是否存在,然后就跳转404,不要先设置tempid后,再判断。
原来的逻辑:
1. 设置session的tempid
2. 判断用户是否存在
3. 不存在就提示错误
修改的逻辑:
1. 判断用户是否存在
2. 不存在就提示
3. 设置session的tempid
这样tempid就不至于直接被修改掉了。
PS:请注意你的态度,我只是帮助解决问题。
2011-11-08 15:57:44
#29 anythink
回复 28 jake 额- -~~~~ 我的态度并没有问题,其实是页面加载了一个不存在的css ,而我又设置404 为页面。
RewriteCond %{REQUEST_URI} !^/(.*)\.(css|jpg|js|gif|png|bmp)/
有个朋友给我说了一个rewrite,用上以后并且把那个不存在的文件找出来并去掉,就可以了~ 虽然是个不起眼的问题,但导致了很大的麻烦。
2011-11-08 16:46:27