使用CodeIgniter构建webapp,我正在使用Cloudflare的灵活SSL。
页面通过HTTPS加载,但只要有重定向,页面就会通过HTTP加载。从那时起,所有页面都通过HTTP提供。
以下是一个例子:
public function logout()
{
$this->session->sess_destroy();
redirect('/');
}
注销功能后,所有页面都通过HTTP加载。
如何确保重定向后通过HTTPS加载页面?
以下是我的.htaccess文件的内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.myurl.com/$1 [R,L]
答案 0 :(得分:2)
您必须配置 .htaccess 文件
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
将example.com替换为您的域
这是您当前的.htaccess文件
的方式<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ /index.php?/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] </IfModule> <IfModule !mod_rewrite.c> ErrorDocument 404 /index.php </IfModule>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Alterative 2使用钩子重定向不需要改变.htaccess
配置更改: - 转到“application / config / config.php”并启用或设置挂钩为true。
$config['enable_hooks'] = TRUE;
在“application / config / hooks.php”中创建一个名为hooks.php的新文件,并在 hooks.php 中添加以下代码:
$hook['post_controller_constructor'][] = array(
'function' => 'redirect_ssl',
'filename' => 'ssl.php',
'filepath' => 'hooks'
);
现在在应用程序目录下创建一个名为“hooks”的新目录,然后在“application / hooks / ssl.php”中创建名为“ssl.php”的新文件 并将以下代码添加到“ssl.php”:
function redirect_ssl() {
$CI =& get_instance();
$class = $CI->router->fetch_class();
$exclude = array('client'); // add more controller name to exclude ssl.
if(!in_array($class,$exclude)) {
// redirecting to ssl.
$CI->config->config['base_url'] = str_replace('http://', 'https://', $CI->config->config['base_url']);
if ($_SERVER['SERVER_PORT'] != 443) redirect($CI->uri->uri_string());
}
else {
// redirecting with no ssl.
$CI->config->config['base_url'] = str_replace('https://', 'http://', $CI->config->config['base_url']);
if ($_SERVER['SERVER_PORT'] == 443) redirect($CI->uri->uri_string());
}
}
答案 1 :(得分:2)
简单的方法可能就是像这样设置base_url
$config['base_url'] = "https://yoursite.com/";
这将导致访问$config['base_url']
的所有CI功能(包括redirect()
)使用https。
base_url()
通过使用第二个争论来强制执行协议的能力并不常说。 e.g。
echo base_url("blog/post/123", 'https');
您可以使用.htaccess强制重定向到https协议。 将其置于现有命令之上。
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]