我怎样才能让CodeIgniter使用SSL加载特定的页面?

我怎样才能让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/"; 

然后,在您的非ssl VirtualHost文件夹中,将您的配置设置为按文件夹将受保护的页面重定向到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'] . “/”; 

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

我会维护两套代码,并使用post_controller_constructor钩子强制重定向到HTTPS页面。 挂钩将在每个页面呈现之前被调用,以检查访问者是否应该根据您网站上的当前位置重定向到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']; 

目录麻烦,你可以使用简单的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']}/"; 

我想到的解决方案就是像这样使用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/'; 

有关协议相关链接的信息 。