2009-09-30 14 views
20

Come posso caricare CodeIgniter su pagine specifiche utilizzando SSL? Ho un server apache2/mode_ssl. mod_ssl utilizza una radice del documento diversa rispetto alle pagine non protette. Ad esempio, https (porta 443) servirebbe pagine fuori /var/www/ssl_html/ E http (porta 80) serve pagine fuori /var/www/html/. Come potrei ottenere CodeIgniter per giocare bene con questa configurazione?Come posso caricare CodeIgniter su pagine specifiche utilizzando SSL?

risposta

16

Ci sono alcuni modi per affrontarlo.

Opzione 1:

mi avrebbe probabilmente il codice distribuito a entrambe le cartelle, quindi nel file: /system/application/config/config.php, impostare la pagina per:

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

o

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

Poi nella cartella VirtualHost non SSL, impostare la configurazione per reindirizzare pagine protette da cartella al sito SSL:

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

Opzione 2:

Invia tutto per SSL e mantenere tutto il codice in una cartella

/system/application/config/config.php, impostare la pagina per:

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

Altre opzioni

Ci sono altri modi hacky per farlo con i reindirizzamenti header() ecc., Ma non credo che vogliate mantenere basi di codice differenti per questa opzione. Non consiglio questo, ma si potrebbe fare qualcosa di simile:

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

Grazie. Penso che andrò con la prima opzione e poi riscriverò l'url_help per gestire https. – ammonkc

+1

La semplice risposta è impostare '' $ config ['base_url'] '' per svuotare la stringa, come in '' = ''; '' - CodeIgniter riconoscerà automaticamente tutto basandosi sull'URL.Di conseguenza, puoi aprire arbitrariamente qualsiasi pagina con o senza SSL, semplicemente digitando l'URL. Non c'è bisogno di dividere il contenuto tra le directory ssl e non_ssl sul tuo server. – f055

+0

solo FYI, questo '$ config ['base_url'] =" http: // ". $ _SERVER ['http_host']. "/"; 'È sbagliato, dovrebbe essere' $ config ['base_url'] \t = 'https: //'. $ _SERVER ["HTTP_HOST"]. '/'; 'La sintassi è errata e $ _SERVER [" http_host "] (minuscolo) non esiste ... –

2

Vorrei mantenere due set del codice e gestire un reindirizzamento forzato alle pagine HTTPS con un hook post_controller_constructor. L'hook verrà chiamato prima che ogni pagina venga sottoposta a rendering per verificare se il visitatore debba essere reindirizzato a HTTPS in base alla posizione corrente sul tuo sito.

FASE 1

creare il file: system/application/ganci/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'); 
      } 
     } 
    } 
} 
?> 

FASE 2

Personalizzare il percorso nella funzione per la quale le aree del vostro sito dovrebbero essere costretti usare HTTPS.

FASE 3

Aggiungere quanto segue system/application/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

In application/config/config.php, impostare base_url a:

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

Ciò permetterà di lavorare su qualsiasi dominio, che è conveniente se si prova a livello locale.

+0

L'ho usato con successo in combinazione con: RewriteCond% {HTTPS} = off RewriteRule^my-secure-url-segment https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] nel mio file .htaccess. – prograhammer

+0

Non ha funzionato per me, $ _SERVER ['SERVER_PORT'] per me è 80; HTTP_X_FORWARDED_PORT è 443 – fedmich

6

ho messo seguenti righe nel file di ./application/config/config.php e funziona perfettamente:

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

ho risolto il problema con in 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']; 

La directory guai , è possibile utilizzare un semplice collegamento simbolico ln -s

0

Questo è ciò che ha funzionato per me. nostro server hanno entrambi $ _SERVER [ 'SERVER_PORT'] e $ _SERVER [ 'HTTP_X_FORWARDED_PORT']

Dovremmo verificare prima se $ _SERVER [ 'HTTP_X_FORWARDED_PORT'] è disponibile e utilizzare questo invece di $ _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']) ; 

testato questo sul nostro server linux ...


btw, è basato sulla risposta di Skyler prima di quale era.

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

Le risposte precedenti non mantengono nome_script se l'elemento di configurazione è distribuito in una sottodirectory, è necessario preservarlo. str_replace (basename ($ _ SERVER ['SCRIPT_NAME']), "", $ _ SERVER ['SCRIPT_NAME']) – fedmich

2

posso facilmente, ho solo definire:

$config['base_url'] = ''; 

CI get base_url = automaticamente D

+0

Non più consigliato, solo FYI. – twistedpixel

+0

sì, CI3 nel config.php dice "NON DEVE essere usato in produzione!" – 2114L3

0

la soluzione che mi è venuta in mente è quello di utilizzare str_replace() in questo modo

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

ogni volta che ho bisogno di una posizione sicura, io uso $ secure_base_url invece di base_url(), così diciamo che il vostro base_url() è http://www.example.com allora $ secure_base_url sarà https://www.example.com

0

un'altra question è simile a questo

è possibile utilizzare un relativo a protocollo url che manterrà la persistenza nel collegamento in CI.

nella vostra config.php invece di:

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

put;

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

informazioni sui collegamenti relativi al protocollo here.

Problemi correlati