2009-09-30 15 views
20

¿Cómo puedo hacer que CodeIgniter cargue páginas específicas usando SSL? Tengo un servidor apache2/mode_ssl. mod_ssl utiliza una raíz de documento diferente que las páginas no seguras. Por ejemplo, https (puerto 443) serviría páginas fuera de /var/www/ssl_html/ Y http (puerto 80) sirve páginas de /var/www/html/. ¿Cómo obtendré CodeIgniter para jugar bien con esta configuración?¿Cómo puedo hacer que CodeIgniter cargue páginas específicas usando SSL?

Respuesta

16

Hay pocas maneras de abordar esto.

Opción 1:

que probablemente tendría el código desplegado a ambas carpetas, a continuación, en el archivo: /system/application/config/config.php, configurar su página a:

$config['base_url'] = "http://www.yoursite.com/"; 

o

$config['base_url'] = "https://www.yoursite.com/"; 

a continuación, en la carpeta de VirtualHost no SSL, establecer su configuración para redirigir las páginas protegidas por carpeta al sitio SSL:

RedirectPermanent /sslfolder https://www.yoursite.com/sslfolder 

Opción 2:

Enviar todo para SSL y mantener todo el código en una carpeta

/system/application/config/config.php, configurar su página a:

$config['base_url'] = "https://www.yoursite.com/"; 

Otras opciones

Existen algunas formas más extravagantes de hacerlo con los redireccionamientos de encabezado(), etc., pero no creo que quiera mantener diferentes bases de código para esta opción. No lo recomiendo, pero podría hacer algo como:

$config['base_url'] = “http://” . $_SERVER['http_host'] . “/”; 
+0

Gracias. Creo que voy a ir con la primera opción y luego reescribir el url_help para manejar https. – ammonkc

+1

La respuesta simple es establecer '' $ config ['base_url'] '' en una cadena vacía, como en '' = ''; '' - CodeIgniter autodetectará todo basándose en la URL.Como resultado, puede abrir arbitrariamente cualquier página con o sin SSL, simplemente escribiendo la URL. No es necesario dividir el contenido entre los directorios ssl y non_ssl en su servidor. – f055

+0

solo FYI, este '$ config ['base_url'] =" http: // ". $ _SERVER ['http_host']. "/"; 'Es incorrecto, debería ser' $ config ['base_url'] \t = 'https: //'. $ _SERVER ["HTTP_HOST"]. '/'; 'La sintaxis es incorrecta y $ _SERVER [" http_host "] (minúsculas) no existe ... –

2

Mantendría dos conjuntos del código y manejaré un redireccionamiento forzado a páginas HTTPS con un enganche post_controller_constructor. Se llamará al gancho antes de que se represente cada página para verificar si el visitante debe ser redirigido a HTTPS en función de su ubicación actual en su sitio.

PASO 1

Crear archivo: system/application/ganchos/SecureAccount.php

<?php 

class SecureAccount 
{ 
    var $obj; 

    //-------------------------------------------------- 
    //SecureAccount constructor 
    function SecureAccount() 
    { 
     $this->obj =& get_instance(); 
    } 

    //-------------------------------------------------- 
    //Redirect to https if in the account area without it 
    function index() 
    { 
     if(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== 'on') 
     { 
      $this->obj =& get_instance(); 
      $this->obj->load->helper(array('url', 'http')); 

      $current = current_url(); 
      $current = parse_url($current); 

      if((stripos($current['path'], "/account/") !== false)) 
      { 
       $current['scheme'] = 'https'; 

       redirect(http_build_url('', $current), 'refresh'); 
      } 
     } 
    } 
} 
?> 

PASO 2

Personalizar la ruta en la función para la que áreas de su sitio deben ser forzados para usar HTTPS

PASO 3

Añadir lo siguiente a sistema/aplicación/config/hooks.php

/* Force HTTPS for account area */ 
$hook['post_controller_constructor'] = array(
           'class' => 'SecureAccount', 
           'function' => 'index', 
           'filename' => 'SecureAccount.php', 
           'filepath' => 'hooks', 
           'params' => array() 
           ); 
11

En application/config/config.php, establecer base_url a:

$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/";

Esto permitirá que funcione en cualquier dominio, que es conveniente si se prueba de forma local.

+0

Lo utilicé con éxito en combinación con: RewriteCond% {HTTPS} = desactivado RewriteRule^my-secure-url-segment https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] en mi archivo .htaccess. – prograhammer

+0

No funcionó para mí, $ _SERVER ['SERVER_PORT'] para mí es 80; HTTP_X_FORWARDED_PORT es 443 – fedmich

6

puse siguientes líneas en el archivo de ./application/config/config.php y funciona perfectamente:

$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; 
$config['base_url'] = $protocol.'://www.yoursite.com'; 
0

me resolvió el problema en config.php

$config['ssl_active'] = false; 
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) { 
    $config['ssl_active'] = true; 
} 

$config['base_url'] = ($config['ssl_active'] === true)?"https":"http" . $_SERVER['HTTP_HOST']; 

El problema directorio , puede usar un simple enlace simbólico ln -s

0

Esto es lo que funcionó para mí. Nuestro servidor ambos tienen $ _SERVER [ 'SERVER_PORT'] y $ _SERVER [ 'HTTP_X_FORWARDED_PORT']

Debemos comprobar primero si $ _SERVER [ 'HTTP_X_FORWARDED_PORT'] está disponible y utilizar esto en vez de $ _SERVER [ 'SERVER_PORT']

$config['base_url'] = 
(((empty($_SERVER['HTTP_X_FORWARDED_PORT']) ? $_SERVER['SERVER_PORT'] : $_SERVER['HTTP_X_FORWARDED_PORT']) == 443 ? 'https' : 'http') . "://" . $_SERVER['HTTP_HOST']) 
. str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']) ; 

probado esto en nuestro servidor Linux ...


por cierto, se basa en la respuesta de Skyler antes de que fuera.

$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/"; 
+0

Las respuestas anteriores no mantienen script_name si CI se implementa en un subdirectorio, debemos conservar esto. str_replace (nombre base ($ _ SERVER ['SCRIPT_NAME']), "", $ _ SERVER ['SCRIPT_NAME']) – fedmich

2

puedo fácilmente, lo único que definir:

$config['base_url'] = ''; 

CI get base_url = automática D

+0

Ya no se recomienda, solo para tu información. – twistedpixel

+0

sí, CI3 en config.php dice "NO DEBE utilizarse en producción". – 2114L3

0

la solución que me vino a la mente es utilizar str_replace() de esta manera

$base_url_str = base_url(); 
$secure_base_url = str_replace("http","https",$base_url_str); 

cada vez que necesito una ubicación segura, uso $ secure_base_url en lugar de base_url(), por lo que digamos que su base_url() es http://www.example.com luego $ secure_base_url será https://www.example.com

0

otra question es similar a este

puede utilizar un URL relativa al protocolo que mantendrá la persistencia en la vinculación de la IC.

en su lugar de config.php:

$config['base_url'] = 'http://example.com/'; 

de venta;

$config['base_url'] = '//example.com/'; 

información sobre enlaces relativas al protocolo here.

Cuestiones relacionadas