wake-up-neo.net

Erzwinge https: // www. für Codeigniter in htaccess mit mod_rewrite

Ich benutze Codeigniter und folge diesen Anweisungen , um ssl zu erzwingen, aber alle Anfragen werden an weitergeleitet

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

Mein .htaccess lautet:

### 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

Ich denke statt

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

sie sollten so etwas haben

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

habe die Regel für die Umschreibungsregel. Ihr Link wird derzeit von der dritten Regel erstellt.

15
feeela

Sie können es im Code tun, anstatt htaccess zu verwenden.

Sie können eine Hilfsfunktion erstellen, die die Seite über SSL umleitet, das Sie von Ihrem Controller aus aufrufen.

In deinem Helfer;

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

Dann in Ihrem Controller;

class Whatever extends CI_Controller {

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

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

Benutze das

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

anstatt  

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

Ich habe zu diesem Zweck die folgende Klasse geschrieben. Ich ziehe es vor, solche Sachen im Code einer Konfigurationsdatei vorzuziehen, so dass das Verhalten nicht durch eine fehlerhafte Konfiguration geändert werden kann (d. H. Eine Seite wird wirklich zu SSL "gezwungen"). 

Die Funktion muss zu einem frühen Zeitpunkt des Ladevorgangs Ihrer Site aufgerufen werden.

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

Ich hoffe es hilft.

0
mils

Vermutlich haben Sie RewriteEngine On irgendwo über diesem Code ...

RewriteCond %{REQUEST_URI} ^system.*

wird wahrscheinlich nicht ausgelöst. REQUEST_URI sollte mit/beginnen (im Gegensatz zu RewriteRule), so dass Sie dies wahrscheinlich möchten

RewriteCond %{REQUEST_URI} ^/system

Ich bin mir nicht sicher

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

wird zuverlässig mit ^ übereinstimmen. Ich würde folgendes versuchen:

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

Übrigens ist HTTP_Host normalerweise das, was der Besucher eingibt, also www. ist nicht garantiert, wenn Sie das wollen. Sie benötigen einen separaten Schritt, um www zu erzwingen.

0
Phil Perry