Codeigniter重定向不在相对重定向中保留HTTPS

Kry*_*ski 4 php codeigniter

我有一个公共和私人区域的网站.私人区域应通过HTTPS提供.我想将一次重定向到显式的HTTPS URL,然后使用相对URL,使所有链接都是安全的.当用户注销时,我将显式链接到绝对不安全的HTTP URL.

我的登录表单通过常规HTTP显示为非安全站点.我的登录表单发布到https://www.mysite.com/login/validate,使用安全连接加载.

我的日志显示Apache正在通过HTTPS加载URL,并且codeigniter正在进行正确的验证.

在我的控制器功能结束时,我重定向到/myaccount使用CodeIgniter的URL帮助程序的redirect方法和相对URL.

redirect('/myaccount');
Run Code Online (Sandbox Code Playgroud)

这会导致codeigniter重定向到非HTTPS URL.

我的配置base_url是非HTTPS:

$config['base_url'] = "http://www.mysite.com"
Run Code Online (Sandbox Code Playgroud)

这是因为网站的某些部分是安全的,而其他部分则不是.

有没有办法告诉CodeIgniter在进行相对重定向时保留HTTPS?为什么假设我想要通过HTTPS加载当前控制器并且我正在进行相对重定向,那么我想进入非HTTPS站点?

对我来说理想的行为是,如果我正在进行相对重定向,它应该保留加载当前请求的协议.相反,它正在切换到config base_url已定义的内容,即使对于相对重定向也是如此.

Jos*_*ber 16

用这个:

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

而不是这个:

$config['base_url'] = "http://www.example.com"
Run Code Online (Sandbox Code Playgroud)

这将始终重定向到您想要的位置.您甚至不必输入您的域名,只需按原样使用即可!


除了上述内容,我还自动加载了这个帮手:

<?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 */
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以将我的各个页面设置为始终使用HTTPS/HTTP(在我的控制器中使用单个方法,或者 - 如果我希望它在构造函数中影响整个控制器).

我只是用:

use_ssl();
Run Code Online (Sandbox Code Playgroud)

在脚本的开头,确定它是通过HTTPS加载的.

或者,如果我只想通过HTTP提供服务,我将使用:

use_ssl(FALSE);
Run Code Online (Sandbox Code Playgroud)