Как я могу заставить CodeIgniter загружать определенные страницы с использованием SSL?
Как я могу заставить CodeIgniter загружать определенные страницы с использованием SSL? У меня есть сервер apache2/mode_ssl
. mod_ssl
использует другой корневой каталог документа, чем незащищенные страницы. Например, https (порт 443) будет обслуживать страницы из /var/www/ssl_html/
, а http (порт 80) будет обслуживать страницы из /var/www/html/
. Как бы мне заставить CodeIgniter хорошо работать с этой настройкой?
10 answers
Существует несколько способов решения этой проблемы.
Вариант 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/";
Другие Варианты
Есть еще несколько хакерских способов сделать это с перенаправлением заголовка() и т. Д. Но я не думаю, что вы хотите поддерживать разные базы кода для этой опции. Я не рекомендую этого, но вы могли бы сделать что-то вроде:
$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. Крючок будет вызываться перед отображением каждой страницы, чтобы проверить, следует ли перенаправлять посетителя на 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 =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['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...
Кстати, это основано на ответе Скайлера, который был раньше.
$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
Вот хорошее решение. http://sajjadhossain.com/2008/10/27/ssl-https-urls-and-codeigniter/