在Laravel 5中跨子域持久化会话

在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,即使我使用

使用5.0

在config/session.php中,我设置了
'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