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

标签 php codeigniter

我的网站有公共(public)区域和私有(private)区域。私有(private)区域 应通过 HTTPS 提供服务。我想重定向到一个明确的 HTTPS url,然后使用相对 URLS 确保所有链接都是安全的。当用户注销时,我将明确链接到一个绝对不安全的 HTTP URL。

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

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

在我的 Controller 函数结束时,我使用 CodeIgniter 的 URL 帮助程序的 redirect 方法和相对 URL 重定向到 /myaccount

redirect('/myaccount');

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

我的配置 base_url 是非 HTTPS 的:

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

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

有没有办法告诉 CodeIgniter 在进行相对重定向时保留 HTTPS?如果当前 Controller 是通过 HTTPS 加载的并且我正在进行相对重定向,为什么假设我想去一个非 HTTPS 站点?

我希望的行为是,如果我进行相对重定向,它应该保留加载当前请求所使用的协议(protocol)。相反,它正在切换到配置 base_url 定义的内容,即使是相对重定向也是如此。

最佳答案

使用这个:

$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(在我的 Controller 中的单个方法中,或者 - 如果我希望它影响整个 Controller - 在构造函数中)。

我只是使用:

use_ssl();

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

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

use_ssl(FALSE);

关于php - Codeigniter 重定向不在相对重定向中保留 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8657428/

相关文章:

php - 处理图像的现成解决方案

php - 这个 MySQL 查询(使用 LEFT OUTER JOIN)有什么问题?

php - 发生数据库错误无法使用提供的设置连接到数据库服务器。文件名 : core/Loader. php 行号:338

php - 通过 PHPSpreadsheet 在 codeigniter 中使用 PHP 上传 2 个 excel 文件

javascript - 在 Codeigniter 中使用 javascript multifield 动态选择框

mysql - 如果表为空,则 CodeIgniter result_array() 出现 bool 错误

php - CodeIgniter:多个应用程序,如何共享资源?

php - 将 DIV 保存为图像

php - mysql - 在 sql 中选择 UNTIL

php - 路由到 Controller