2010-12-17 10 views
1

Ich habe eine CakePHP-Website entwickelt, die SSL für alle Seiten verwenden sollte. Es funktioniert wie erwartet, außer wenn ich Redirect in einem Controller verwende leitet es an http: //subdomain.domain.com nicht https: //subdomain.domain.com/controller/action.Umleitung in CakePHP ssl Website Routen zu http nicht HTTPS

Ich habe löste dies durch einen virtuellen Host für Port 80 zeigt auf dem CakePHP-Anwendung erstellen und diese Rewrite-Regeln in .htaccess

RewriteCond% hinzugefügt {HTTPS} off RewriteRule (. *) https://% {HTTP_HOST}% {REQUEST_URI} [L]

Diese Situation wird abgefangen und auf https umgeleitet, was jedoch unnötigen zusätzlichen Datenverkehr zum Server zur Folge hat.

Die Ursache für diesen zusätzlichen Datenverkehr ist die Redirect-Funktion, da sie falsche URLs generiert. Ich habe in die Umleitungsfunktion geschaut und es ruft Router :: url auf, um die tatsächliche URL zu erstellen. Ich bin jedoch nicht in der Lage herauszufinden, wie oder wo den Router anweisen, https nicht http zu verwenden.

Tim

Antwort

0

Ich fand den Fehler, es war eine Fehlkonfiguration von Apache.

Beim Ausprobieren der Jamies-Lösung endete die Site in einer Umleitungsschleife, weil RequestHandler-> isSSL() false zurückgegeben hat, selbst wenn die Anfrage https war. Ich entdeckte dann, dass der $ _SERVER ['https'] nicht gesetzt war und der $ _SERVER ['port'] 80 war, nicht 443 wie erwartet.

An diesem Punkt habe ich meine ssl-Richtlinien in sites-available/default gesetzt,

SSLEngine on 
SSLCertificateFile [path to cert file] 
SSLCertificateKeyFile [path to keyfile] 

Verschieben der ssl-Richtlinien an den virtuellen Host für die Sub-Domain das Problem gelöst, mit Umleitungsschleifen.

Eigentlich ist gelöst auch mein erstes Problem, weil die URL überprüft :: Methode Router für $ _SERVER [ ‚https‘], wenn gesetzt es erzeugt eine URL, die mit https beginnt: sonst nur http:

ich beide getestet habe Jamesies Lösung und meine eigenen Regeln in .htaccess umschreiben und beide funktionieren wie erwartet nach der Behebung.

Tim

5

Ich bin ein bisschen eine Vermutung nehmen, aber ich vermute, dass es diese sehr RewriteRule ist, die Dinge ist in Unordnung.

Sie sollten "umleiten" nicht "umschreiben". Die generierten Links von Cake sind normalerweise relativ zum root. Geben Sie also kein Protokoll an, es sei denn, Sie übergeben "true" als zweiten Parameter.

Ich habe auch Apache hören sowohl auf 80 und 443, so dass ich zumindest auf inkorrekte Anfragen reagieren kann.

Dies ist der Code, den ich in meiner AppController Klasse haben die gleiche Sache zu tun:

function beforeFilter() { 
    parent::beforeFilter(); 
    $this->_setupSecurity(); 
} 

function _setupSecurity() { 
    $this->Security->blackHoleCallback = '_badRequest'; 
    if(Configure::read('forceSSL')) { 
     $this->Security->requireSecure('*'); 
    } 
} 

/** 
* The main SecurityComponent callback. 
* Handles both missing SSL problems and general bad requests. 
*/ 

function _badRequest() { 
    if(Configure::read('forceSSL') && !$this->RequestHandler->isSSL()) { 
     $this->_forceSSL(); 
    } else { 
     $this->cakeError('error400'); 
    } 
    exit; 
} 

/** 
* Redirect to the same page, but with the https protocol and exit. 
*/ 

function _forceSSL() { 
    $this->redirect('https://' . env('SERVER_NAME') . $this->here); 
    exit; 
} 

ich meine eigene Config auch dies auf die je nach und off ‚forceSSL‘ Option in bootstrap.php haben für das Drehen Umgebung, so dass für die oben genannten Arbeiten auf wahr gesetzt werden muss.

0

Sein Beispiel bereits in dem Kochbuch erwähnt wird http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#usage

class AppController extends Controller { 
    // Add security component 
    public $components = array('Security'); 

    public function beforeFilter() { 
     $this->Security->blackHoleCallback = 'forceSSL'; 
     $this->Security->requireSecure(); 
    } 

    // Add this function in your AppController 
    public function forceSSL() { 
     return $this->redirect('https://' . env('SERVER_NAME') . $this->here); 
    } 
} 
Verwandte Themen