从HTTPS重定向到HTTP

时间:2017-05-08 19:07:00

标签: php codeigniter ssl https cloudflare

使用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]

2 个答案:

答案 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]