ppluobo 发表于 2013-7-8 16:49:21

CI bug 修复

本帖最后由 ppluobo 于 2013-7-8 16:56 编辑

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

经过分析发现 , form_open生产连接时使用了site_url函数,这个部分是site_url函数的原始代码:

if ( ! function_exists('site_url'))
{
      function site_url($uri = '')
      {
                $CI =& get_instance();
                return $CI->config->site_url($uri);
      }
}

查找CI_config类可以看到这一部分关于 http协议或https协议的代码:

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参数,得到如下结果:
["HTTPS"]=>string(0) ""这个就是问题的所在,参考PHP手册,php中这样规定:
'HTTPS'
如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。   Note: 注意当使用 IIS 上的 ISAPI 方式时,如果不是通过 HTTPS 协议被访问,这个值将为 off。
也就是说,使用http协议访问时,$_SERVER['HTTPS'] 可以或可能是一个空值,而非unset,修改代码如下:

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]
查看完整版本: CI bug 修复