对于所有遇到此错误的人。
当您更改 SESSION_DOMAIN 环境参数时,Laravel 将发出新的 cookie,但旧的 cookie 仍在浏览器内存中。
当请求从浏览器发送到 Laravel 应用程序时,旧 cookie 具有优先权,因此您无法登录。
解决方案是删除浏览器中的旧cookie(那些没有任何域注册的cookie,因此是应用程序的实际主机)。
此错误通常会困扰那些想要添加多个子域持久登录的人。更糟糕的是,当您的应用程序已经投入生产时,您的所有客户/用户都将遭受此问题的困扰。在完全清除旧的 cookie 之前,没有人能够登录(不仅如此,而且主要是)您的应用程序。
我通过添加 Laravel 应用程序 HTTP 中间件解决了这个问题,它为我解决了这个问题:
<?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);
}
}
请注意,当您仅使用此时:
Cookie::queue(Cookie::make('laravel_session', null, -6000, '/', 'yourdomain.com'))
or
Cookie::queue(Cookie::forget('laravel_session', '/', 'yourdomain.com'))
Laravel 将发送带有域的 Cookie 标头,因此浏览器将创建带有域的 cookie.yourdomain.com
- 这就是为什么不会删除任何内容(与前一个域相比不同的域)。