2009-09-30 92 views
20

如何讓CodeIgniter使用SSL加載特定頁面?我有一個apache2/mode_ssl服務器。 mod_ssl使用與非安全頁面不同的文檔根目錄。例如,https(端口443)將服務於/var/www/ssl_html/以外的頁面並且http(端口80)服務於/var/www/html/中的頁面。我怎樣才能讓CodeIgniter和這個設置一起玩呢?如何讓CodeIgniter使用SSL加載特定頁面?

回答

16

有幾種方法可以解決這個問題。

選項1:

我可能會部署到這兩個文件夾,然後在文件中的代碼:/system/application/config/config.php,設定你的網頁:

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

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

然後在您的非SSL虛擬主機文件夾,設置你的配置重定向保護的頁面被夾到SSL網站:

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

選項2:

發送一切SSL,並保持所有的代碼在一個文件夾中

/system/application/config/config.php,設置你的頁面:

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

其他選項

還有一些hacky方法可以通過header()重定向等方式做到這一點,但我不認爲你想爲這個選項維護不同的代碼庫。我不建議這樣做,但你可以這樣做:

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

謝謝。我想我會選擇第一個選項,然後重寫url_help來處理https。 – ammonkc 2009-09-30 21:06:11

+1

簡單的答案是將''config ['base_url']''設置爲空字符串,就像在''=''中那樣 - CodeIgniter會根據URL自動檢測所有的東西。因此,只需輸入URL,就可以隨意打開任何帶或不帶SSL的頁面。無需在服務器上的ssl和non_ssl目錄之間拆分內容。 – f055 2014-03-20 22:19:33

+0

只是FYI,這個'$ config ['base_url'] =「http://」。 $ _SERVER ['http_host']。 「/」;'錯了,應該是'$ config ['base_url'] \t ='https://'。 $ _SERVER [「HTTP_HOST」]。 '/';'語法錯誤,$ _SERVER [「http_host」](小寫)不存在... – 2014-03-25 03:24:37

2

我會維護兩套代碼,並使用post_controller_constructor掛鉤強制重定向到HTTPS頁面。掛鉤將在每個頁面呈現之前調用,以檢查訪問者是否應根據您網站上的當前位置重定向到HTTPS。

STEP 1

創建文件:系統/應用/鉤/ 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'); 
      } 
     } 
    } 
} 
?> 

STEP 2

自定義自己網站的區域應該被強迫在功能路徑使用HTTPS。

步驟3

添加以下系統/應用/配置/ hooks.php

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

在應用/配置/配置。PHP,設置BASE_URL到:

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

這將允許它在任何領域,如果你在本地測試是方便工作。

+0

我將此成功地用於: RewriteCond%{HTTPS} = off RewriteRule^my-secure-url-segment https://%{HTTP_HOST}%{REQUEST_URI} [R = 301,L] 在我的.htaccess文件中。 – prograhammer 2013-06-05 21:45:12

+0

沒有爲我工作,$ _SERVER ['SERVER_PORT']對我來說是80; HTTP_X_FORWARDED_PORT是443 – fedmich 2013-10-22 04:11:49

6

我把下面的行./application/config/config.php文件,它完美的作品:

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

我在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']; 

目錄麻煩解決了這個問題, ,你可以使用簡單的simbolic鏈接ln -s

0

這是爲我工作的。 我們的服務器都具有$ _ SERVER [ 'SERVER_PORT']$ _ SERVER [ 'HTTP_X_FORWARDED_PORT']

我們應該首先檢查是否$ _ SERVER [ 'HTTP_X_FORWARDED_PORT']可用,並用這個代替$的_ 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']) ; 

測試了這個我們的Linux服務器上...


順便說一句,這是基於skyler的答案之前。

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

如果CI部署在子目錄中,以前的答案不會保留script_name,我們需要保留這一點。 str_replace(basename($ _ SERVER ['SCRIPT_NAME']),「」,$ _ SERVER ['SCRIPT_NAME']) – fedmich 2013-10-22 04:26:50

2

我可以很容易的,我只定義:

$config['base_url'] = ''; 

CI GET BASE_URL automaticaly = d

+0

不再推薦,僅供參考。 – twistedpixel 2016-04-20 11:27:12

+0

是的,CI3在config.php中說「不能用於生產!」 – 2114L3 2016-12-12 10:13:06

0

是來到我的腦海的解決方案是使用str_replace()函數像這樣

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

每當我需要一個安全的位置,我使用$ secure_base_url而不是base_url(), 讓我們說你BASE_URL()是http://www.example.com然後$ secure_base_url將https://www.example.com

0

另一question與此類似

可以使用相對協議網址這將保持持續的連接在CI。

中,而不是你的config.php

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

放;

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

有關協議相關鏈接的信息here

相關問題