勉强看懂写的是什么东西。
zen cart 去掉URL地址带?zenid=的参数 彻底解决
1、在后台Configuration->session 将Force CookieUse 设置为ture;一般如果网站只是在刚开启的时候存在zenid的话,那么,只要这样设置一下就可以了;注意:本设置将会强制要求使用cookie,部分客户会因此无法购物,则出现cookieusage页面,请慎用!另一种就是从头到尾,URL地址后面一直都会有一串zenid= 参数后缀,这个情况可能是因为缓存文件夹没有写分配权限或者不存在,可以试试方案2.
2、引用英文论坛上的一个正确回复:
In case some of you are wondering why zen_id is all of a suddenbeing added to your links (or always has) and you want it gone: Besure that your “Session Directory” inConfiguration>Sessions is set to a directory thatactually exists and is writable. If the directory doesn’t exist,then zen cart will starting adding zenid to URLS. Hope this helps.这句话的意思就是说在zen-cart后台的Configuration>Sessions里有一项SessionDirectory,它是指定session所使用的文件夹的,如果这个文件夹不存在,或者不可写的话。那么就会在URL上显示zenid=,当然,解决方法就是让这个项所指向的文件夹存在并且可写。后台设置Session Directory:设置成你网站存放的正确路径
Cookie Domain: True
Force Cookie Use: True
遇到URL后面带有一串&zenid=…..的地址而地址是无效的情况下,彻底解决的办法是在html_output.php里面修改代码,具体操作如下:找到if (isset($sid)) { $link .= $separator . zen_output_string($sid);}这段代码,把它屏蔽掉就可以了。 如果在后台设置force cookies为true的话,可能会造成顾客会无法完成付款流程。
仁者见仁,智者见智,用什么方法比较好,自己去体会啦。
以上2种方案的确可以解决zenid参数问题,不过我现在想讨论多一些。首先说”Force CookieUse”,先看一段原代码:
01
04 $session_started = false;
05 if (SESSION_FORCE_COOKIE_USE == 'True'){
06zen_setcookie('cookie_test', 'please_accept_for_session',time()+60*60*24*30, '/', (zen_not_null($current_domain) ?$current_domain : ''));
07
08 if(isset($_COOKIE['cookie_test'])) {
09zen_session_start();
10$session_started = true;
11 }
12 } elseif (SESSION_BLOCK_SPIDERS == 'True'){
13 $user_agent =strtolower($_SERVER['HTTP_USER_AGENT']);
14 $spider_flag =false;
15 if(zen_not_null($user_agent)) {
16$spiders = file(DIR_WS_INCLUDES .'spiders.txt');
17for ($i=0, $n=sizeof($spiders); $i<$n; $i++){
18if (zen_not_null($spiders[$i])) {
19if (is_integer(strpos($user_agent, trim($spiders[$i])))){
20$spider_flag = true;
21break;
22}
23}
24}
25 }
26 if ($spider_flag ==false) {
27zen_session_start();
28$session_started = true;
29 }
30 } else {
31zen_session_start();
32 $session_started =true;
33 }
很明显可以看到,如果SESSION_FORCE_COOKIE_USE =='True',SESSION_BLOCK_SPIDERS =='True'以下的代码段就不会有效,可是以下这段代码很关键,它可以阻止机器人开启会话,如果SESSION_FORCE_COOKIE_USE== 'True',意思就是说不管是什么UA,全部开启会话....这真是一个很糟糕的建议,或者本身的程序设计也有点问题。所以我不建议使用这个方法。
接下来我们看看zenid这个参数是怎么被添加进去的,没有疑问,一定是在构建链接的时候添加,打开html_output.php文件定位到zen_href_link函数,我们发现这个函数有一个参数并带默认值$add_session_id= true,然后看一下这个函数源代码:
01 if ( ($add_session_id == true)&& ($session_started == true)&& (SESSION_FORCE_COOKIE_USE =='False') ) {
02 if (defined('SID')&& zen_not_null(SID)){
03$sid = SID;
04 } elseif ( (($request_type == 'NONSSL') &&($connection == 'SSL') &&(ENABLE_SSL == 'true') ) || ( ($request_type == 'SSL')&& ($connection == 'NONSSL') ) ){
05if ($http_domain != $https_domain) {
06$sid = zen_session_name() . '=' .zen_session_id();
07}
08 }
09 }
10 //中间的省....
11 if (isset($sid)) {
12 $link .= $separator .zen_output_string($sid);
13 }
14 //以下部分省....
很容易看到,这个zenid就是这样被添加进去的,如果SESSION_FORCE_COOKIE_USE =='True',那么不符合条件,这个zenid自然就不会添加,所以这个就是第一种方法可以实现不添加zenid的代码实现。我们看到 if( ($add_session_id == true) &&($session_started == true) &&(SESSION_FORCE_COOKIE_USE == 'False') ) 这个条件中还有一个$add_session_id ==true,如果把它设置成false,那么自然也可以实现不添加这个zenid的了。这样做好处是没有第一种方法那样产生副作用,不太好的地方时要修改zen_href_link函数参数的默认值(就是改为$add_session_id== false)。
如果$add_session_id ==false,不管怎么样,一定不会有zenid这个尾巴,然而如果终端浏览器禁用Cookie,带这个尾巴是保持会话的前提,但是浏览器禁用Cookie似乎是未雨绸缪的,所以我大胆假设所有用户都没有禁用Cookie...
至于第二种方式说如果保存会话文件的文件夹不可写就会添加zenid我暂时找不到这是哪门子逻辑,如果它不可写,那么会话数据无法保存,那么把这个尾巴带上也于事无补,殊不知,带上这个尾巴的本质意义就在于当Cookie没有启用,那么就根据这个尾巴来跟踪保持会话,至于保存会话的文件夹是否可写根本就是两回事