web-dev-qa-db-fra.com

Force https: // www. pour Codeigniter dans htaccess avec mod_rewrite

J'utilise Codeigniter et suis ces instructions pour forcer SSL mais toutes les demandes sont redirigées

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

Mon .htaccess est:

### 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]
13
Ben

Je pense, au lieu de

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

vous devriez avoir quelque chose comme

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

faire correspondre la règle de réécriture. Votre lien est actuellement produit par la troisième règle.

15
feeela

Vous pouvez le faire en code au lieu d'utiliser htaccess.

Vous pouvez créer une fonction d'assistance redirigeant la page via SSL, que vous appelez depuis votre contrôleur.

Dans votre aide

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

Puis dans votre contrôleur;

class Whatever extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->helper(array('your_ssl_helper'));
    }

    public function index() {
        force_ssl();
        ...
    }
}
18
Rooneyl

Utilisez ceci

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

au lieu de  

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
7
Monkey D Luffy

J'ai écrit la classe suivante à cet effet. Je préfère avoir ce genre de choses dans le code plutôt que dans un fichier de configuration, de sorte que le comportement ne puisse pas être modifié par une mauvaise configuration (c'est-à-dire qu'une page est vraiment "forcée" à SSL). 

La fonction doit être appelée à un stade précoce du processus de chargement de votre site.

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

J'espère que ça aide.

0
mils

Vraisemblablement, vous avez RewriteEngine On quelque part au-dessus de ce code ...

RewriteCond %{REQUEST_URI} ^system.*

ne va probablement pas se déclencher. REQUEST_URI doit commencer par/(contrairement à RewriteRule), vous voulez donc probablement

RewriteCond %{REQUEST_URI} ^/system

Je ne suis pas sûr que

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

correspondra de manière fiable, avec ^. Je voudrais essayer ce qui suit:

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

Incidemment, HTTP_Host est normalement ce que le visiteur a tapé, donc www. n'est pas garanti, si c'est ce que vous voulez. Vous aurez besoin d'une étape distincte pour forcer www ..

0
Phil Perry