Как я могу использовать CodeIgniter для загрузки определенных страниц с использованием SSL?  У меня есть сервер apache2 / mode_ssl .  mod_ssl использует другой корень документа, чем незащищенные страницы.  Например, https (порт 443) будет обслуживать страницы из /var/www/ssl_html/ И http (порт 80) обслуживает страницы из /var/www/html/ .  Как мне заставить CodeIgniter играть с этой настройкой? 
Есть несколько способов решить эту проблему.
Опция 1:
Вероятно, у меня был бы код, развернутый в обе папки, а затем в файле: /system/application/config/config.php, чтобы установить страницу:
 $config['base_url'] = "http://www.yoursite.com/"; 
или
 $config['base_url'] = "https://www.yoursite.com/"; 
Затем в вашей папке VirtualHost, отличной от ssl, установите ваш конфиг для перенаправления защищенных страниц по папке на сайт SSL:
 RedirectPermanent /sslfolder https://www.yoursite.com/sslfolder 
Вариант 2:
Отправляйте все на SSL и сохраняйте весь свой код в одной папке
/system/application/config/config.php, установите для своей страницы:
 $config['base_url'] = "https://www.yoursite.com/"; 
Другие варианты
Есть еще несколько хакерских способов сделать это с переадресацией header () и т. Д., Но я не думаю, что вы хотите поддерживать разные базы кода для этой опции. Я не рекомендую это, но вы можете сделать что-то вроде:
 $config['base_url'] = “http://” . $_SERVER['http_host'] . “/”; 
В application / config / config.php установите base_url в:
 $config['base_url'] = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['HTTP_HOST']}/"; 
Это позволит работать в любом домене, что удобно, если вы тестируете локально.
Я помещаю следующие строки в файл ./application/config/config.php, и он отлично работает:
 $protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http'; $config['base_url'] = $protocol.'://www.yoursite.com'; 
Я бы сохранил два набора кода и обрабатывал принудительное перенаправление на HTTPS-страницы с помощью post_controller_constructor hook. Крюк будет вызываться до того, как будет отображаться каждая страница, чтобы проверить, должен ли посетитель перенаправляться на HTTPS на основе их текущего местоположения на вашем сайте.
ШАГ 1
Создать файл: system / application / hooks / 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'); } } } } ?> 
ШАГ 2
Настройте путь в функции, для которой необходимо, чтобы сайты вашего сайта использовали HTTPS.
ШАГ 3
Добавьте в 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() ); 
Я могу легко, я только определяю:
 $config['base_url'] = ''; 
CI получает base_url automaticaly = D
Я решил проблему с помощью 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']; 
Проблема с каталогом, вы можете использовать простую символьную ссылку 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']}/"; 
решение, которое мне пришло в голову, – это использовать 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
другой вопрос подобен этому
вы можете использовать URL-адрес, относящийся к протоколу, который будет сохранять постоянство при связывании в CI.
  в вашем config.php вместо: 
 $config['base_url'] = 'http://example.com/'; 
положил;
 $config['base_url'] = '//example.com/'; 
информацию об относительных для протокола ссылках.
Вот хорошее решение. http://sajjadhossain.com/2008/10/27/ssl-https-urls-and-codeigniter/