Force https: // www. для Codeigniter в htaccess с mod_rewrite

Я использую Codeigniter и следую этим инструкциям для принудительного ssl, но все запросы перенаправляются на

http://staging.example.com/index.php/https:/staging.example.com 

Мой .htaccess :

 ### Canonicalize codeigniter URLs # Enforce SSL https://www. RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ### # Removes access to the system folder by users. # Additionally this will allow you to create a System.php controller, # previously this would not have been possible. # 'system' can be replaced if you have renamed your system folder. RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ /index.php/$1 [L] # Checks to see if the user is attempting to access a valid file, # such as an image or css document, if this isn't true it sends the # request to index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] 

    Я думаю, вместо

     RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

    вы должны иметь что-то вроде

     RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

    действительно ли соответствие правила перезаписи. Ваша ссылка в настоящее время подготовлена ​​третьим правилом.

    Вы можете сделать это в коде вместо использования htaccess.

    Вы можете создать вспомогательную функцию, которая перенаправляет страницу на SSL, которую вы вызываете с вашего контроллера.

    В вашем помощнике;

     function force_ssl() { if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") { $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; redirect($url); exit; } } 

    Затем в вашем контроллере;

     class Whatever extends CI_Controller { function __construct() { parent::__construct(); $this->load->helper(array('your_ssl_helper')); } public function index() { force_ssl(); ... } } 

    Использовать это

     RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L] 

    вместо

     RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

    Предположительно, у вас есть RewriteEngine On Где-то над этим кодом …

     RewriteCond %{REQUEST_URI} ^system.* 

    вероятно, не будет запущен. REQUEST_URI должен начинаться с / (в отличие от RewriteRule), поэтому вы, вероятно, захотите

     RewriteCond %{REQUEST_URI} ^/system 

    Я не уверен, что

     RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

    будет надежно соответствовать, с ^. Я бы попробовал следующее:

     RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301] 

    Кстати, HTTP_HOST, как правило, независимо от того, что посетитель набрал, так что www. не гарантируется, если это то, что вы хотите. Вам понадобится отдельный шаг, чтобы заставить www ..

    Для этой цели я написал следующий класс. Я предпочитаю иметь такие вещи в коде над конфигурационным файлом, чтобы поведение не могло быть изменено с помощью плохой конфигурации (т. Е. Страница действительно «принудительно»).

    Эта функция должна быть вызвана на ранней стадии процесса загрузки вашего сайта.

     class SecurityHelper extends MX_Controller { // CONTROLLERS FORCED TO SSL private $arrHttps = array( 'products/shipping', 'products/billing' ); // CONTROLLERS ACCESSIBLE FROM BOTH private $arrAgnostic = array ( 'products/getcart' ); function redirectSsl() { // SSL MODULES if(in_array(uri_string(), $this->arrHttps)) { // ONLY REDIRECT IF NECESSARY if ($_SERVER['HTTPS'] != "on") { // REDIRECTING TO SSL $newUrl = str_replace('http://', 'https://', base_url($_SERVER['REQUEST_URI'])); redirect($newUrl); } } // NON-SSL MODULES else { // IF AGNOSTIC, DON'T REDIRECT if(in_array(uri_string(), $this->arrAgnostic)) return; // ONLY REDIRECT IF NECESSARY if ($_SERVER['HTTPS'] == "on") { $newUrl = str_replace('https://', 'http://', base_url($_SERVER['REQUEST_URI'])); redirect($newUrl); } } } } 

    Надеюсь, поможет.