はじめに
1台のマシン上にバーチャルホストで複数のサイトを運用していたとします。
DBは共通で、同じドメインのサブドメインで運用されたLaravelのサイトだったとします。
sample01.example.jp
sample02.example.jp
ここまでくると、片方でログインしたらもう一方でもログイン状態を維持したい、という要望だって出てくるでしょう。
セッション管理をRedisで行う選択肢が取れる場合、Laravelであれば特別なことは何もせずに達成可能です。
解決方法
クッキーのdomain属性を利用します。
ドメイン名が後方一致する場合のみクッキーを送信する、という条件です。
Laravelであれば設定ファイルのsession.phpか.envファイルにてSESSION_DOMAINを設定する事で利用できます。
.env
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_DOMAIN='.example.jp'
REDIS_HOST=xxx.cache.amazonaws.com
REDIS_PASSWORD=null
REDIS_PORT=6379
注意点
.envファイルで設定したのに、別のサイトへ移動した瞬間にログアウトされる問題に悩まされた事がありました。
原因は、一報ではミドルウェアグループでセッションミドルウェアを呼び出し、
もう一方ではグローバルミドルウェアでセッションミドルウェアを呼び出していたためでした。
app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\Illuminate\Session\Middleware\StartSession::class,
],
];
app/Http/Kernel.php
protected $middleware = [
\Illuminate\Session\Middleware\StartSession::class,
];
おわりに
Laravelは大変便利ですが、出来ることが多すぎて些細な?設定ミスで動かなくなる事があり悩まされます。