http通信でCakephpのセッションでデータが受け渡せなかったときの話!

Web開発
この記事は約4分で読めます。

こんにちは、@Manabu です。

Cakephpのアプリ開発中に、発生したデータの受け渡しができなかった件について紹介します。

httpでサイトを運営することなんてないと思いますが、EC2とEIPで開発している時とかに、同様の事象が発生する可能性があるので、ぜひ参考にしてください。

発生した事象

Cakephpのアプリ内でデータを受け渡す時、sessionを使う方法があります。

以下の内容は、checkのメソッドに処理が行った時に入力チェックをして、エラーがあればセッションでデータを渡してindexメソッドにリダイレクトする処理です。

public function index(){
    $session = $this->getRequest()->getSession();
    $errors = $session->read('errors');
    // 中略

}

public function check(){
    // 中略

    $errors = $this->validateInput($datas);
    if (!empty($errors)) {
        $session = $this->getRequest()->getSession();
        // エラーがある場合、エラーをセッションに保存し、indexページにリダイレクト
        $session->write('errors', $errors);
        return $this->redirect("/controller/index");
    }
}

こちらの内容で、セッションがうまくいかず、エラーも表示されない状態でした。

解決方法

公式サイトを見ると、以下のような設定がconfig/app.phpに記載されているとのことでした。

'Session' => [
        'defaults' => 'php',
        'timeout' => 1440, // 単位は分(1440分=1日)
        'ini' => [
            'session.cookie_secure' => true,
            'session.cookie_lifetime' => 0, // 0にするとブラウザを閉じたらセッションが切れる
            'session.gc_maxlifetime' => 86400, // 1日(単位は秒)
        ],
    ]

この中で、session.cookie_secure」という値が、SSL(HTTPS通信)のみを許可するかどうかを設定している部分になるようです。

こちらの値をfalseに変更することで、セッション情報を受け渡すことができるようになりました。

対応後のソース

'Session' => [
        'defaults' => 'php',
        'timeout' => 1440, 
        'ini' => [
            'session.cookie_secure' => false,   // httpの場合falseに変更
            'session.cookie_lifetime' => 0, 
            'session.gc_maxlifetime' => 86400, 
        ],
    ]

以下、公式サイトです。

セッション - 5.x

まとめ

基本的に、このような状況でアプリの開発をすることはないと思いますが、同じようになった場合、エラーも出てこないので厄介です。

ぜひ参考にしてください。