在Laravel 5中跨子域持久化会话
使用5.0 在config/session.php中,我设置了在Laravel 5中跨子域持久化会话,laravel,laravel-5,Laravel,Laravel 5,使用5.0 在config/session.php中,我设置了'domain'=>'.example.com',但它不起作用。我无法在这样一个域上持久化会话 我的网站有许多子域: vancouver.example.com newyork.example.com 等等。。。它们托管在同一台服务器上,并且是同一个Laravel应用程序(共享同一存储目录) 我使用正确的凭据登录,应用程序将重定向到站点上的另一个页面,此时我没有会话var_dump(Auth::user())显示null,即使我使用
'domain'=>'.example.com'
,但它不起作用。我无法在这样一个域上持久化会话
我的网站有许多子域:
vancouver.example.com
newyork.example.com
等等。。。它们托管在同一台服务器上,并且是同一个Laravel应用程序(共享同一存储目录)
我使用正确的凭据登录,应用程序将重定向到站点上的另一个页面,此时我没有会话var_dump(Auth::user())
显示null
,即使我使用正确的凭据登录
storage/framework/sessions
在那里显示了14个不同的文件,它们都是为我准备的,我在开始测试之前就把它们清除掉了
我会附上我的AuthController@postLogin方法,如果session.php'domain'=>null
public function postLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email', 'password' => 'required',
]);
$credentials = $request->only('email', 'password');
if ($this->auth->attempt($credentials, $request->has('remember'))) {
Session::flash('message', 'You are now logged in.');
Session::flash('status', 'success');
if (str_contains($_SERVER['HTTP_REFERER'], '?goto=')) {
$params = explode('?', $_SERVER['HTTP_REFERER'])[1];
$target = explode('=', $params)[1];
} else {
$target = '/';
}
return redirect($target);
}
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => $this->getFailedLoginMessage(),
]);
}
您是否尝试过将会话存储在数据库、memcached或redis中而不是文件中?我和你的情况类似,在数据库中存储会话为我解决了这个问题
由于某些原因,Laravel的会话驱动程序在使用文件驱动程序时无法正确处理跨域会话。解决了这个问题。更新session.php中的
domain=>'.example.com'
,并清除相关站点的cookies。@gadss
您需要像这样添加会话表
php artisan session:table
composer dump-autoload
php artisan migrate
并将.env改为
SESSION\u DRIVER=数据库
还要修改config/session.php
'driver'=>env('SESSION\u driver','database')
和
'domain' => '.yourdomain.com'
然后清除浏览器的缓存和cookie。如果有人仍然遇到子域cookie问题。尝试在config/Session.php中更改会话Cookie名称。您需要更新会话配置,以便在域范围内(包括子域)持久化会话。按照下面给出的步骤操作
转到config/session.php
并将带有前缀
的域更新为config=>'。your domain.com'
然后清除应用程序缓存,打开Chrome开发工具,进入应用程序>应用程序>清除存储。您还需要清除以前的cookies
运行artisan命令php artisan config:cache
或php artisan config:clear
以删除以前缓存的laravel应用程序配置
如果使用数据库作为会话驱动程序,则需要为此创建会话表。运行命令php-artisan-session:table
生成会话表迁移,然后使用php-artisan-migrate
进行迁移。然后执行上面给出的三个步骤。对于Laravel 8,它变得更简单:
将会话域添加到.env文件中:
清除配置缓存:
php artisan config:cache
删除浏览器会话cookie,然后在所有子域之间共享会话
在我的情况下,我习惯于在www.domain上创建帐户后将用户自动登录到子域。工作正常。我以前也遇到过同样的问题,只是需要清除浏览器缓存。是的,我正在使用文件驱动程序,今晚我将尝试使用数据库。谢谢。@AnthonyVipond你试过使用数据库吗?你的结果是什么?谢谢!Laravel 4.2完美地处理带有文件会话的子域,但在Laravel 5.2上,我必须切换到数据库会话存储。@BrokenBinary我想在不同的子域中保留相同的会话。。laravelI发现我必须手动删除存储在storeage\framework\sessions
中的会话,并清除cookie缓存,我该如何处理这些会话呢。我也这么做了,但不是为我工作。。你的意思是浏览器cookies吗?#YouArea LifeSaver注意:如果你在一次失败的尝试后执行此解决方案,不要忘记删除所有子域上的所有现有cookies。在Laravel 5.4中,现在可以在.env文件中使用SESSION\u DOMAIN
@DucChi配置此功能。很高兴能提供帮助。清除存储对开发人员来说很好,但是当我们投入生产时,用户应该怎么做呢?你需要忘记所有的cookies,如果你的站点已经投入生产,那么你可以部署一些东西来根据请求清除所有的客户端cookies。谢谢你的快速回复!已清除的会话、配置和缓存仍不工作。不确定我们应该为用户清除哪些cookie您需要清除会话cookie以避免使用旧配置创建的旧会话。要确认是需要协议(http://或http://),还是直接输入域名
php artisan config:cache