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

[修补 Patch] CI bug 修复

[复制链接]
发表于 2013-7-8 16:49:21 | 显示全部楼层 |阅读模式
本帖最后由 ppluobo 于 2013-7-8 16:56 编辑

使用CI框架开发时,遇到一个问题,当没有配置 base_url的情况下,使用form_open函数产生的form表单的action会使用https协议,导致form提交的会话和正常登录的会话不一致,引发错误。

经过分析发现 , form_open生产连接时使用了site_url函数,这个部分是site_url函数的原始代码:
PHP复制代码
 
if ( ! function_exists('site_url'))
{
        function site_url($uri = '')
        {
                $CI =& get_instance();
                return $CI->config->site_url($uri);
        }
}
 
复制代码

查找CI_config类可以看到这一部分关于 http协议或https协议的代码:
PHP复制代码
 
if ($this->config['base_url'] == '')
                {
                        if (isset($_SERVER['HTTP_HOST']))
                        {
                                $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
                                $base_url .= '://'. $_SERVER['HTTP_HOST'];
                                $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
                        }
 
                        else
                        {
                                $base_url = 'http://localhost/';
                        }
 
                        $this->set_item('base_url', $base_url);
                }
 
复制代码

当前服务器为nginx,打印$_SERVER参数,得到如下结果:
PHP复制代码
  ["HTTPS"]=>  string(0) ""
复制代码
这个就是问题的所在,参考PHP手册,php中这样规定:
'HTTPS'
如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
     Note: 注意当使用 IIS 上的 ISAPI 方式时,如果不是通过 HTTPS 协议被访问,这个值将为 off
也就是说,使用http协议访问时,$_SERVER['HTTPS'] 可以或可能是一个空值,而非unset,修改代码如下:
PHP复制代码
 
if ($this->config['base_url'] == '')
                {
                        if (isset($_SERVER['HTTP_HOST']))
                        {
                                $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' && $_SERVER['HTTPS']!==''? 'https' : 'http';
                                $base_url .= '://'. $_SERVER['HTTP_HOST'];
                                $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
                        }
 
                        else
                        {
                                $base_url = 'http://localhost/';
                        }
 
                        $this->set_item('base_url', $base_url);
                }
 
复制代码


重新访问应用程序,所有form表单action链接正确,问题解决。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 很给力!

查看全部评分

本版积分规则