先说下我的环境吧,我是nginx的服务器,并不是apache的。可能此文章导致的这个问题和nginx有关。

在用codeigniter编写项目的时候,使用redirect()函数发现出来的居然是https的URL。这个就令我纳闷了,为什么,我明明没有https连接,为什么老给我解析成https呢。

我看了下redirect()的代码,里面调用到了site_url()。发现这个是系统类库的一个文件,在构造器的地方初始化了这个https的问题。我们来看看这个相关的代码。

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/';
}

我们看第三行,对$_SERVER['HTTPS']里面的相关值进行的。因此我们必须得打印出来看看系统的值是什么。

Array(
    [HTTPS] =>  string(0) ""
    [HTTP_HOST] => string(10)  "host.local"
)

可以看到我的Nginx在$_SERVER['HTTPS']居然为空字符串。因此codeigniter的这个判断是否是https是有问题的。应该修改修改。

应该修改成

isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';

关于$_SERVER['HTTPS']这个定义,我们是可以在Nginx的站点配置进行更改。因此我们也不好说会是个什么情况。

另外在/system/helpers/url_helper.php中的redirect()函数我觉得不是太合理。官方在拼接URL的时候使用了site_url('/news/local/123')这个函数拼接出来的结果是http://host.local/index.php/news/local/123。个人感觉不太合适,因为我们自己做了URL的重写,那么就不应该出现/index.php/的字眼。因此这里我改用了base_url()函数。