[Laravel 8.x] 登入/登出時出現 419 頁面會話已超時

最近網站很常出現 419 錯誤,不知道具體發生原因,但大概可以猜是 csrf token 不相符造成。

一、設定 SESSION_DOMAIN

網路上也有人遇到相同的問題,解決的方式是在 .env 檔中設定 SESSION_DOMAIN。
// 如果是在本地端,不用填
SESSION_DOMAIN=

// 伺服端,設定網站 domain
SESSION_DOMAIN="webdomain.com.tw"
執行 php artisan cache:clear

二、清 cookie

我設定好後上線想觀察一段時間看還會不會發生,殊不知網站直接變成無法登入,必須要清 cookie 才行,對於一個已經在使用中的網站,突然叫使用者清 cookie 超不合理的吧,這就衍生第二個問題,怎麼自動清 cookie?

我們新增一個 middleware 專門來處理這件事,內容如下:
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Cookie;

class ForgotOldSessionCookies
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        Cookie::queue(new \Symfony\Component\HttpFoundation\Cookie('laravel_session', null, now()->subYear(1)->timestamp, '/'));
        Cookie::queue(new \Symfony\Component\HttpFoundation\Cookie('XSRF-TOKEN', null, now()->subYear(1)->timestamp, '/'));

        return $next($request);
    }
}
並且在 app/Http/Kernel.php 加入。
/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        ...
        \App\Http\Middleware\ForgotOldSessionCookies::class,
    ],
];
不過比較可惜的是這個方法一直沒有上線,所以我不知道是否真的能解決問題,僅紀錄備用。

留言