Сила https://www. для Codeigniter в htaccess с mod_rewrite - PullRequest
13 голосов
/ 14 декабря 2011

Я использую 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]

Ответы [ 5 ]

19 голосов
/ 14 декабря 2011

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

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

Inваш помощник;

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();
        ...
    }
}
16 голосов
/ 14 декабря 2011

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

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

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

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

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

8 голосов
/ 27 марта 2013

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

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]
0 голосов
/ 19 августа 2016

Я написал следующий класс для этой цели.Я предпочитаю размещать подобные вещи в коде, а не в файле конфигурации, чтобы поведение не могло быть изменено из-за плохой конфигурации (т. Е. Страница действительно «вынуждена» использовать 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);
            }
        }
    }
}

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

0 голосов
/ 31 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...