我有一个公共和私人区域的网站.私人区域应通过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)
| 归档时间: |
|
| 查看次数: |
7047 次 |
| 最近记录: |