Подтвердить что ты не робот

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

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

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

My .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]
4b9b3361

Ответ 1

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

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

у вас должно быть что-то вроде

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

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

Ответ 2

Вы можете сделать это в коде вместо использования 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();
        ...
    }
}

Ответ 3

Используйте этот

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]

Ответ 4

Предположительно, у вас есть 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..

Ответ 5

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

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

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);
            }
        }
    }
}

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