如何讓CodeIgniter使用SSL加載特定頁面?我有一個apache2/mode_ssl
服務器。 mod_ssl
使用與非安全頁面不同的文檔根目錄。例如,https(端口443)將服務於/var/www/ssl_html/
以外的頁面並且http(端口80)服務於/var/www/html/
中的頁面。我怎樣才能讓CodeIgniter和這個設置一起玩呢?如何讓CodeIgniter使用SSL加載特定頁面?
回答
有幾種方法可以解決這個問題。
選項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'] . 「/」;
我會維護兩套代碼,並使用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()
);
在應用/配置/配置。PHP,設置BASE_URL到:
$config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/";
這將允許它在任何領域,如果你在本地測試是方便工作。
我將此成功地用於: RewriteCond%{HTTPS} = off RewriteRule^my-secure-url-segment https://%{HTTP_HOST}%{REQUEST_URI} [R = 301,L] 在我的.htaccess文件中。 – prograhammer 2013-06-05 21:45:12
沒有爲我工作,$ _SERVER ['SERVER_PORT']對我來說是80; HTTP_X_FORWARDED_PORT是443 – fedmich 2013-10-22 04:11:49
我把下面的行./application/config/config.php文件,它完美的作品:
$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
$config['base_url'] = $protocol.'://www.yoursite.com';
我在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
這是爲我工作的。 我們的服務器都具有$ _ 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']}/";
如果CI部署在子目錄中,以前的答案不會保留script_name,我們需要保留這一點。 str_replace(basename($ _ SERVER ['SCRIPT_NAME']),「」,$ _ SERVER ['SCRIPT_NAME']) – fedmich 2013-10-22 04:26:50
我可以很容易的,我只定義:
$config['base_url'] = '';
CI GET BASE_URL automaticaly = d
不再推薦,僅供參考。 – twistedpixel 2016-04-20 11:27:12
是的,CI3在config.php中說「不能用於生產!」 – 2114L3 2016-12-12 10:13:06
是來到我的腦海的解決方案是使用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
- 1. codeigniter,在特定頁面上強制ssl
- 2. 特定頁面禁用SSL
- 3. 如何在SSL頁面上加載CSS?
- 4. 動態頁面加載使用codeigniter
- 5. Node.js加載如何讓頁面載入
- 6. 如何爲div加載CodeIgniter的頁面
- 7. 如何使用htaccess加載特定頁面的子域url
- 8. 如何使用javascript檢測特定的頁面加載?
- 9. 如何使用RequireJS加載頁面特定的JS文件?
- 10. 如何提高特定頁面的頁面加載速度
- 11. 如何使用Require.js在特定頁面上加載特定腳本?
- 12. 如何使用jQuery在Codeigniter中加載頁面
- 13. 如何使用Codeigniter控制器加載頁面?
- 14. 如何讓硒承認頁面加載?
- 15. 特定頁面頁面的Javascript頁面加載延遲
- 16. 如何在加載頁面後讓視頻在特定位置開始播放?
- 17. 如何將特定頁面加載到iframe時調用javascript
- 18. 如何在特定頁面上調用窗口加載事件
- 19. 如何讓頁面動作出現在特定頁面上?
- 20. 如何讓JQuery在頁面加載時加載圖像?
- 21. 如何讓div加載點擊時不加載頁面?
- 22. 加載一個特定的PHP頁面
- 23. 隱藏特定頁面的加載欄
- 24. 加載測試特定頁面
- 25. JQuery()加載到特定頁面?id =#number
- 26. UISegmentedControl重新加載特定頁面
- 27. 如何讓頁面重新加載在RoR中指定div?
- 28. 如何禁用XSS清除codeigniter中的特定頁面?
- 29. Meteor SSL保護特定頁面
- 30. 如何使用onModuleLoad()加載頁面,使用定時器
謝謝。我想我會選擇第一個選項,然後重寫url_help來處理https。 – ammonkc 2009-09-30 21:06:11
簡單的答案是將''config ['base_url']''設置爲空字符串,就像在''=''中那樣 - CodeIgniter會根據URL自動檢測所有的東西。因此,只需輸入URL,就可以隨意打開任何帶或不帶SSL的頁面。無需在服務器上的ssl和non_ssl目錄之間拆分內容。 – f055 2014-03-20 22:19:33
只是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