2011-12-14 33 views
12

estoy usando CodeIgniter y siguiendo these instructions para forzar SSL, pero todas las peticiones está siendo redirigido aFuerza https: // www. para CodeIgniter en .htaccess con mod_rewrite

http://staging.example.com/index.php/https:/staging.example.com 

Mi .htaccess es:

### Canonicalize codeigniter URLs 

# Enforce SSL https://www. 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

### 
# Removes access to the system folder by users. 
# Additionally this will allow you to create a System.php controller, 
# previously this would not have been possible. 
# 'system' can be replaced if you have renamed your system folder. 
RewriteCond %{REQUEST_URI} ^system.* 
RewriteRule ^(.*)$ /index.php/$1 [L] 

# Checks to see if the user is attempting to access a valid file, 
# such as an image or css document, if this isn't true it sends the 
# request to index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
+0

¡Genial! ¿Cuál es la pregunta? SO! = Debug-it-for-me.com –

Respuesta

16

Creo que, en lugar de

RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

debe tener algo como

RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

tienen la coincidencia de la regla de reescritura. Su enlace está producido actualmente por la tercera regla.

18

Puede hacerlo en código en lugar de usar htaccess.

Puede crear una función auxiliar que redireccionará la página para que sea a través de SSL, a la que llamará desde su controlador.

En su ayudante;

function force_ssl() { 
    if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") { 
     $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 
     redirect($url); 
     exit; 
    } 
} 

Luego en su controlador;

class Whatever extends CI_Controller { 

    function __construct() { 
     parent::__construct(); 
     $this->load->helper(array('your_ssl_helper')); 
    } 

    public function index() { 
     force_ssl(); 
     ... 
    } 
} 
+2

Desde mi punto de vista, el protocolo es algo que el servidor debe manejar sin que la aplicación tenga nada que ver con eso, si eso es posible (respetando los requisitos de la aplicación). Los clientes pueden usar HTTP o HTTPS, o tal vez incluso [SPDY] (https://en.wikipedia.org/wiki/SPDY). – feeela

+0

Creo que esta es una solución muy elegante para CI. Aunque puedo apreciar el punto de vista de Feeela, considero que controlar esto desde dentro de su aplicación es consistente con el estilo de flujo y estilo de trabajo de CI. Del mismo modo, otras tareas comunes de .htaccess se manejan con la característica de enrutamiento de CI. –

+0

Necesito cambiar la constante de $ _SERVER ['HTTPS']! = "On" a $ _SERVER ['HTTPS']! = "1" para que esto funcione en mi sistema. – YudhiWidyatama

7

Utilice esta

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L] 

en lugar de

RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
+1

salvar mi vida: D –

0

Es de suponer que usted tiene RewriteEngine On algún lugar por encima de este código ...

RewriteCond %{REQUEST_URI} ^system.* 

probablemente no se active. REQUEST_URI debe comenzar con/(a ​​diferencia de RewriteRule), por lo que es probable que desee

RewriteCond %{REQUEST_URI} ^/system 

No estoy seguro de que

RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

coincidirá con fiabilidad, con ^. Me gustaría probar el siguiente:

RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301] 

Por cierto, HTTP_HOST es normalmente lo que el visitante ha escrito en, por lo www. no está garantizado, si eso es lo que quieres. Necesitará un paso separado para forzar www ..

0

Escribí la siguiente clase para este propósito. Prefiero tener cosas como esta en el código sobre un archivo de configuración, para que el comportamiento no pueda ser modificado por una configuración incorrecta (es decir, una página es realmente "forzada" a SSL).

La función debe invocarse en una etapa temprana del proceso de carga de su sitio.

class SecurityHelper extends MX_Controller 
{ 
    // CONTROLLERS FORCED TO SSL 
    private $arrHttps = array(
     'products/shipping', 
     'products/billing' 
    ); 

    // CONTROLLERS ACCESSIBLE FROM BOTH 
    private $arrAgnostic = array (
     'products/getcart' 
    ); 

    function redirectSsl() 
    { 
     // SSL MODULES 
     if(in_array(uri_string(), $this->arrHttps)) 
     { 
      // ONLY REDIRECT IF NECESSARY 
      if ($_SERVER['HTTPS'] != "on") 
      { 
       // REDIRECTING TO SSL 
       $newUrl = str_replace('http://', 'https://', base_url($_SERVER['REQUEST_URI'])); 
       redirect($newUrl); 
      } 
     } 
     // NON-SSL MODULES 
     else 
     { 
      // IF AGNOSTIC, DON'T REDIRECT 
      if(in_array(uri_string(), $this->arrAgnostic)) 
       return; 

      // ONLY REDIRECT IF NECESSARY 
      if ($_SERVER['HTTPS'] == "on") 
      { 
       $newUrl = str_replace('https://', 'http://', base_url($_SERVER['REQUEST_URI'])); 
       redirect($newUrl); 
      } 
     } 
    } 
} 

Espero que ayude.

Cuestiones relacionadas