如何使用SSL使用CodeIgniter加载特定页面?

时间:2009-09-30 20:38:35

标签: php apache ssl codeigniter https

如何使用SSL使用CodeIgniter加载特定页面?我有一个apache2 / mode_ssl服务器。 mod_ssl使用与非安全页面不同的文档根。例如,https(端口443)将提供/var/www/ssl_html/之外的页面,http(端口80)提供/var/www/html/之外的页面。我如何让CodeIgniter在这个设置中发挥出色?

10 个答案:

答案 0 :(得分:17)

解决这个问题的方法很少。

选项1:

我可能会将代码部署到两个文件夹,然后在文件中:/system/application/config/config.php,将您的页面设置为:

$config['base_url'] = "http://www.yoursite.com/"; 

$config['base_url'] = "https://www.yoursite.com/";

然后在您的非ssl VirtualHost文件夹中,将您的配置设置为按文件夹将受保护的页面重定向到SSL站点:

RedirectPermanent /sslfolder https://www.yoursite.com/sslfolder

选项2:

将所有内容发送到SSL,并将所有代码保存在一个文件夹中

/system/application/config/config.php,将您的页面设置为:

$config['base_url'] = "https://www.yoursite.com/";

其他选项

使用header()重定向等等,有一些更糟糕的方法可以做到这一点,但我认为你不想为这个选项维护不同的代码库。我不推荐这个,但你可以这样做:

$config['base_url'] = “http://” . $_SERVER['http_host'] . “/”;

答案 1 :(得分:11)

在application / config / config.php中,将base_url设置为:

$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/";

这将允许它在任何域上工作,这在本地测试时很方便。

答案 2 :(得分:6)

我将以下行放在./application/config/config.php文件中,它运行正常:

$protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
$config['base_url'] = $protocol.'://www.yoursite.com';

答案 3 :(得分:3)

我会维护两组代码并使用post_controller_constructor挂钩处理强制重定向到HTTPS页面。在呈现每个页面之前将调用该钩子,以检查访问者是否应根据其站点上的当前位置重定向到HTTPS。

第1步

创建文件:system / application / hooks / SecureAccount.php

<?php

class SecureAccount
{
    var $obj;

    //--------------------------------------------------
    //SecureAccount constructor
    function SecureAccount()
    {
        $this->obj =& get_instance();
    }

    //--------------------------------------------------
    //Redirect to https if in the account area without it
    function index()
    {
        if(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== 'on')
        {
            $this->obj =& get_instance();
            $this->obj->load->helper(array('url', 'http'));

            $current = current_url();
            $current = parse_url($current);

            if((stripos($current['path'], "/account/") !== false))
            {
                $current['scheme'] = 'https';

                redirect(http_build_url('', $current), 'refresh');
            }
        }
    }
}
?>

第2步

自定义功能中应强制您的站点区域使用HTTPS的路径。

第3步

将以下内容添加到system / application / config / hooks.php

/* Force HTTPS for account area */
$hook['post_controller_constructor'] = array(
                                'class'    => 'SecureAccount',
                                'function' => 'index',
                                'filename' => 'SecureAccount.php',
                                'filepath' => 'hooks',
                                'params'   => array()
                                );

答案 4 :(得分:2)

我很容易,我只定义:

$config['base_url'] = '';

CI get base_url automaticaly = D

答案 5 :(得分:0)

我在config.php中解决了这个问题

$config['ssl_active'] = false;
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) {
    $config['ssl_active'] = true;
}

$config['base_url'] = ($config['ssl_active'] === true )?"https":"http" . $_SERVER['HTTP_HOST'];

目录有问题,可以使用简单的符号链接ln -s

答案 6 :(得分:0)

这对我有用。 我们的服务器都有 $ _ SERVER ['SERVER_PORT'] $ _ SERVER ['HTTP_X_FORWARDED_PORT']

我们应先检查 $ _ SERVER ['HTTP_X_FORWARDED_PORT'] 是否可用,并使用此代替$ _SERVER ['SERVER_PORT']

$config['base_url'] =
( ( ( empty($_SERVER['HTTP_X_FORWARDED_PORT']) ? $_SERVER['SERVER_PORT'] : $_SERVER['HTTP_X_FORWARDED_PORT'] ) == 443 ? 'https' : 'http') . "://" . $_SERVER['HTTP_HOST'] )
. str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']) ;

在我们的linux服务器上测试了这个...


顺便说一句,这是基于skyler之前的回答。

$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/";

答案 7 :(得分:0)

我想到的解决方案就是像这样使用str_replace()

$base_url_str = base_url(); 
$secure_base_url = str_replace("http","https",$base_url_str );

每当我需要一个安全的位置时,我使用$ secure_base_url而不是base_url(), 所以我们说你的base_url()是http://www.example.com然后$ secure_base_url将是https://www.example.com

答案 8 :(得分:0)

另一个question与此类似

您可以使用协议相对网址,这将保持CI中链接的持久性。

config.php而不是:

$config['base_url'] = 'http://example.com/';

放;

$config['base_url'] = '//example.com/';

有关协议相关链接的信息here

答案 9 :(得分:-1)