Перенаправление Codeigniter не сохраняет HTTPS в относительных перенаправлениях - PullRequest
4 голосов
/ 28 декабря 2011

У меня есть сайт, который имеет публичную и приватную область.Частная зона должна обслуживаться через HTTPS.Я хочу один раз перенаправить на явный URL-адрес HTTPS, а затем, используя относительные URL-адреса, обеспечить безопасность всех ссылок.Когда пользователь выходит из системы, я буду явно ссылаться на абсолютный незащищенный URL-адрес HTTP.

Моя форма входа отображается незащищенным сайтом через обычный HTTP.Моя форма входа отправляется на https://www.mysite.com/login/validate, который загружается с использованием безопасного соединения.

Мои журналы показывают, что Apache загружает URL-адрес через HTTPS, а codeigniter выполняет правильную проверку.

В концесвоей функции контроллера я перенаправляю на /myaccount, используя метод CodeIgniter URL-помощника redirect с относительным URL-адресом.

redirect('/myaccount');

Это приводит к перенаправлению codeigniter на URL-адрес, отличный от HTTPS.

Моя конфигурация base_url не HTTPS:

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

Это потому, что некоторые части сайта безопасны, а другие нет.

Есть ли способ сообщить CodeIgniter о сохранении HTTPS при выполнении относительных перенаправлений?Почему предполагается, что я хочу перейти на сайт без HTTPS, если текущий контроллер был загружен через HTTPS, и я делаю относительное перенаправление?

Желаемое для меня поведение: если я делаю относительное перенаправление, он должен сохранять протокол, по которому был загружен текущий запрос.Вместо этого он переключается на то, что определил config base_url, даже для относительных перенаправлений.

Ответы [ 3 ]

16 голосов
/ 28 декабря 2011

Используйте это:

$config['base_url'] = "http".((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "s" : "")."://".$_SERVER['HTTP_HOST'].str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);

Вместо этого:

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

Это всегда будет перенаправлять туда, куда вы хотите.Вам даже не нужно вводить доменное имя, просто используйте его как есть!


В дополнение к вышесказанному, я также автоматически загружаю этот помощник:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function is_https_on()
{
    return isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on';
}

function use_ssl($turn_on = TRUE)
{
    $url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

    if ( $turn_on )
    {
        if ( ! is_https_on() && $_SERVER['HTTP_HOST'] != 'localhost')
        {
            redirect('https://' . $url, 'location', 301 );
            exit;
        }
    }
    else
    {
        if ( is_https_on() )
        {
            redirect('http://' . $url, 'location', 301 );
            exit;
        }
    }
}

/* End of file https_helper.php */
/* Location: ./application/helpers/https_helper.php */

С этимвместо этого я могу настроить свои отдельные страницы так, чтобы они всегда использовали HTTPS / HTTP (либо одним методом в моем контроллере, либо - если я хочу, чтобы это влияло на весь контроллер - в конструкторе).

Я простоиспользуйте:

use_ssl();

в начале скрипта, чтобы убедиться, что он загружен через HTTPS.

В качестве альтернативы, если я хочу обслуживать его только через HTTP, я буду использовать:

use_ssl(FALSE);
2 голосов
/ 28 декабря 2011

Не существует готового способа обработки этой передачи обслуживания HTTPS / HTTP в CI.Что вы МОЖЕТЕ сделать, так это создать небольшого помощника (который вы включаете автоматически), который добавит функцию, подобную secure_url(), и довольно просто вернет то, что будет base_url, но в формате https.

Вы должны будетеэмулировать ту же функцию redirect, что и secure_redirect().

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

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

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

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

ставить;

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

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

Я проверял это на ie11, chrom (e | ium), firefox, midori, используя библиотеку форм CI и базовые ссылки. все браузеры соблюдают эту спецификацию, и я видел, как она использовалась без изменений.

дополнительно CI версии 3 имеет встроенную функцию is_https вы должны иметь возможность просто использовать is_https в вашем контроллере (например, в конструкции) и перенаправить, если не https, а затем, используя вышеупомянутый метод, поддерживать http или https без постоянных перенаправлений.

Например, чтобы сохранить весь контроллер как https, вставьте в контроллер:

public function __construct()
{
    parent::__construct();
    $this->load->helper('url');
    if(! is_https()){
        redirect('https:'.base_url('/page'));
    }
    //!! $conig['base_url'] must be protocol-relative
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...