Как я могу заставить CodeIgniter загружать определенные страницы, используя SSL? - PullRequest
20 голосов
/ 01 октября 2009

Как я могу CodeIgniter загружать определенные страницы, используя SSL? У меня есть сервер apache2 / mode_ssl. mod_ssl использует корень документа, отличный от незащищенных страниц. Например, https (порт 443) будет обслуживать страницы из /var/www/ssl_html/, а http (порт 80) будет обслуживать страницы из /var/www/html/. Как мне заставить CodeIgniter хорошо играть с этой настройкой?

Ответы [ 10 ]

17 голосов
/ 01 октября 2009

Есть несколько способов справиться с этим.

Вариант 1:

Я бы, вероятно, развернул код в обеих папках, а затем в файле: /system/application/config/config.php установите вашу страницу на:

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

или

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

Затем в вашей папке VirtualHost, отличной от ssl, установите конфигурацию для перенаправления защищенных страниц по папкам на сайт 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'] . “/”;
11 голосов
/ 21 мая 2012

В application / config / config.php установите base_url равным:

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

Это позволит работать на любом домене, что удобно, если вы тестируете локально.

6 голосов
/ 31 января 2013

Я поместил следующие строки в файл ./application/config/config.php, и он отлично работает:

$protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';
$config['base_url'] = $protocol.'://www.yoursite.com';
3 голосов
/ 26 января 2012

Я бы поддерживал два набора кода и обрабатывал принудительное перенаправление на HTTPS-страницы с помощью ловушки post_controller_constructor. Хук будет вызываться перед каждой страницей, чтобы проверить, следует ли перенаправлять посетителя на 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()
                                );
2 голосов
/ 29 августа 2014

Я могу легко, я определяю только:

$config['base_url'] = '';

CI автоматически получает base_url = D

0 голосов
/ 12 декабря 2016

другой вопрос похож на этот

вы можете использовать относительный к протоколу URL , который сохранит постоянство при связывании в CI.

в вашем config.php вместо:

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

ставить;

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

информация о протокол-относительных ссылках здесь .

0 голосов
/ 04 декабря 2015

решение, которое пришло мне в голову - это использовать 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

0 голосов
/ 22 октября 2013

Вот что у меня сработало. Оба наших сервера имеют $ _ 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 ...


Кстати, он основан на ответе Скайлера, перед которым был.

$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/";
0 голосов
/ 14 февраля 2013

Я решил проблему с в 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

0 голосов
/ 09 января 2012
...