Перенаправление с HTTPS на HTTP
Веб-приложение построено с использованием CodeIgniter, а я использую гибкий SSL Cloudflare.
Страницы загружаются по протоколу 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]
2 answers
Простым способом может быть установка base_url следующим образом
$config['base_url'] = "https://yoursite.com/";
Это приведет к тому, что все функции CI, которые обращаются к $config['base_url']
, включая redirect()
, будут использовать https.
Не часто говорят о способности base_url()
принудительно использовать протокол с помощью второго аргумента. например,
echo base_url("blog/post/123", 'https');
Вы можете использовать .htaccess для принудительного перенаправления на протокол https. Поместите это выше существующих команд.
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Вам необходимо настроить файл .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]
Изменение 2 с помощью крючков для перенаправления нет необходимости изменять.htaccess
Изменения конфигурации: - Перейдите к "application/config/config.php " и включите или установите для крючков значение true.
$config['enable_hooks'] = TRUE;
Создайте новый файл с именем hooks.php в "application/config/hooks.php " и добавьте приведенный ниже код в hooks.php:
$hook['post_controller_constructor'][] = array(
'function' => 'redirect_ssl',
'filename' => 'ssl.php',
'filepath' => 'hooks'
);
Теперь создайте новый каталог с именем "крючки" в каталоге приложений, а затем создайте новый файл с именем"ssl.php "в "application/hooks/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());
}
}