|
本帖最后由 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手册,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链接正确,问题解决。 |
评分
-
查看全部评分
|