我的网站有公共(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/