Cookieが反映されなくて悩んだお話
PHP側とJavaScript側でデータのやりとりをしたいときに色々方法はあると思いますが今回はCookieを使用することになりました。
フレームワークはLaravelで。
コードは下記のような感じ。
PHP
use Illuminate\Support\Facades\Cookie; //値取得 $strText = Cookie::get('strText'); if($strText==""){ //値がなければセット Cookie::queue('strText', 'test'); $strText = 'test'; }
JavaScript
//値セット document.cookie = 'strText=test';
ローカルでは上記で問題なく動作しておりました。
しかしテストサーバにアップすると上手く動作せず調べてみるとJavaScript側でセットした値がPHP側で取得できていないという。。。
よくあるパターンですが頑張って調べました。
原因はサブドメイン
調査した結果、テストサーバでサブドメイン(test.hoge.com)を設定していたことが原因だったようです。
JavaScriptではdomainやpathを指定できるのでそこをごにょごにょすればよさそうで。
下記のように設定してみたところ正常に反映されるようになりました。
//値セット //document.cookie = 'strText=test'; document.cookie = 'strText=test;domain=.hoge.com;path=/;';
domainの指定にドットをつけてあげるとよいみたい。
これで解決したと思い本番サーバへアップしたところ、またまた動作せず調べてみるとやっぱりcookieが取得できない。。。
思いついたのは、テストサーバと本番サーバが別のレンタルサーバだったのでサーバ側の問題ではないかと。
chromeさんの検証機能でチェックしてみると違いが明らかに。
本番サーバではSameSiteがLaxに、HttpOnlyにチェックがついていました。
Strict:cookie利用不可
Lax:POSTやiframe等はcookie利用不可
None:cookie利用可
JavaScriptなどからアクセスできないようにする
本番サーバではPHP側で値セットした際に付与される設定になっているのだと思われます。
まずはJavaScript側を下記のように修正。
//値セット //document.cookie = 'strText=test'; //document.cookie = 'strText=test;domain=.hoge.com;path=/;'; document.cookie = 'strText=test;domain=.hoge.com;path=/;SameSite=lax;';
SameSiteは設定できるのですがHttpOnlyはバックエンドでしか設定できないためPHP側を修正します。
Laravelのconfig/session.php
//'http_only' => true, 'http_only' => false,
これで本番サーバでも動作することができました。
環境によってハテナな動きをすることがありますが一つずつチェックしていけばなんとかなるというお話でした。
コメント