【问题标题】:Laravel sessions does not being stored with multiple domainsLaravel 会话不存储在多个域中
【发布时间】:2019-10-13 23:12:07
【问题描述】:

我正在使用中间件根据域选择内容,但仅在其中一个中存储会话。想法不是在他们之间共享会话。每个域都必须有自己的会话。

问题示例是 CSRF 令牌在每次重新加载时都会刷新。

我已尝试为每个域(cookie 名称、路径、域)设置配置,并尝试过 cookie、文件和数据库。这些都不起作用。

部分中间件代码:

config([
    'session.domain' => $domain,
    'session.cookie' => $slugDomain . '_session',
    'session.path' => '/' . $slugDomain
]);

【问题讨论】:

    标签: php laravel session dns


    【解决方案1】:

    有多种方法可以做到这一点,这里我分享一个选项: 您可以在域 1 的 url 中传递 id,然后将此 id 存储到域 2 的 cookie 中:

    您可以为特定会话创建 cookie:

    Route::get('setcookie', function(){
      Session::setId($_GET['id']);
      Session::start();
      return 'Cookie created';
    });`
    

    那么你应该可以通过$user = Auth::User;获得你的用户

    这就是我找到解决方案的方法。

    另一种解决方案是将app/config/session.php 中的域设置为:

    'domain' => '.domain.com'
    

    source

    【讨论】:

    • 此解决方案适用于域和子域之间的共享会话。就我而言,我想为每个域使用单独的会话。
    【解决方案2】:

    我发现了问题。出现中间件正在修改 URI,但在 URI 末尾有两个条。控制器正常执行,但由于 URI 会话结束时的双条没有被持久化。

    新代码:

    //...
        $newReq = $request->duplicate();
        $newPath = '/store' . (substr($request->path(), 0, 1) === '/' ? '' : '/') . $request->path();
        $newReq->server->set('REQUEST_URI', $newPath);
    
        return $next($newReq);
    

    $newPath 之前是

    $newPath = '/store/' . $request->path();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 2017-11-19
      • 2019-05-02
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2017-08-23
      • 2017-05-07
      相关资源
      最近更新 更多