Я использую 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); } } } }
Надеюсь, поможет.