こんにちは、@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
まとめ
基本的に、このような状況でアプリの開発をすることはないと思いますが、同じようになった場合、エラーも出てこないので厄介です。
ぜひ参考にしてください。