helen's blog

ずっとおもしろいことしてたいな。

CakePHPでALLHTTPSに

CakePHPで全ページをhttpsにするのに苦労したときのメモが出てきたのでまとめてたら
当時の自分何してたんだってことに気づきました( ゚∀゚)

一般的な?やり方

SecurityコンポーネントとblackHoleCallbackを使って
こんな感じにAppControllerに以下追加

public $components = array('Security');

public  function beforeFilter(){
    if( $_SERVER['SERVER_PORT'] == 80 ) { // 何らかの手段でhttpであることを判定させる
        $this->Security->blackHoleCallback = 'forceHttps';
        // ↓でアクション単位の設定ができ, 指定なしなので全アクションhttpsになる
        $this->Security->requireSecure();
    }
}

public function forceHttps() {
    // $this->here でURIを取れる
    $this->redirect('https://' . env('SERVER_NAME') . $this->here);
}

でもapacheでhttp→httpsにしたところ、
既に特殊Routingを組まれているせいで上記がこけたのと
Controllerでやるのはなぁと思っていたので下記対応を入れてみた

routesに書く

Router::fullbaseUrl('https://' . $_SERVER["HTTP_HOST"]);

lib/Cake/Routing/Router.phpを見ると

public static function fullBaseUrl($base = null) {
  if ($base !== null) { // fullbaseUrlを設定すると
    self::$_fullBaseUrl = $base;
    Configure::write('App.fullBaseUrl', $base); // 上書きされる!
  }
  if (empty(self::$_fullBaseUrl)) { // 設定されなかったら
    self::$_fullBaseUrl = Configure::read('App.fullBaseUrl'); // 設定を見る
  }
  return self::$_fullBaseUrl;
}

こんな感じでConfigのApp.fullBaseUrlが上書きされている

なので

普通にConfigでやればよかった!
Configure::write('App.fullBaseUrl', 'https://'.$_SERVER["HTTP_HOST"]);

当時の自分、相当必死だったんだろうなぁ...と思った

個人的には

$this->Security->blackHoleCallback = 'forceHttps';

の見た目が気持ち悪くて苦手