【问题标题】:Persisting sessions across subdomains in Laravel 5在 Laravel 5 中跨子域持久化会话
【发布时间】:2015-08-01 01:00:50
【问题描述】:

使用 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(),
                ]);
}

【问题讨论】:

  • 我之前也遇到过同样的问题,只需要清除浏览器缓存。

标签: laravel laravel-5


【解决方案1】:

您是否尝试过将会话存储在数据库、memcached 或 redis 中而不是文件中?我的情况与您的情况相似,将会话存储在数据库中为我解决了这个问题。

由于某种原因,Laravel 的会话驱动程序在使用文件驱动程序时无法正确处理跨域会话。

【讨论】:

  • 是的,我正在使用文件驱动程序,今晚我将尝试使用数据库。谢谢。
  • @AnthonyVipond 你试过使用数据库吗?你的结果是什么?
  • 谢谢! Laravel 4.2 完美地处理带有文件会话的子域,但在 Laravel 5.2 上我不得不切换到数据库会话存储。
  • @BrokenBinary 我想在不同的子域中保持相同的会话.. 我怎么能用 laravel 做到这一点
  • 我发现我必须手动删除存储在storeage\framework\sessions 中的会话以及清除cookie 缓存。然后它工作正常。
【解决方案2】:

想通了。更新 session.php 中的 domain => '.example.com' 并清除相关站点的 cookie。

【讨论】:

  • 我也做了同样的事,但对我不起作用..stackoverflow.com/questions/39714443/…
  • 你的意思是浏览器cookies吗?
  • #youarealifesaver
  • 注意:如果您在尝试不成功后执行此解决方案,请不要忘记删除所有子域上的所有现有 cookie。
  • 在 Laravel 5.4 中,现在可以使用 SESSION_DOMAIN 在 .env 文件中进行配置。
【解决方案3】:

@gadss

你需要像这样添加会话表

php artisan session:table

composer dump-autoload

php artisan migrate

并将 .env 更改为 SESSION_DRIVER=database

同时修改config/session.php

'driver' => env('SESSION_DRIVER', 'database')

'domain' => '.yourdomain.com'

然后清除浏览器的缓存和 cookie。

【讨论】:

  • @DucChi 很高兴为您提供帮助。
【解决方案4】:

如果有人仍然遇到子域 cookie 的问题。尝试更改 config/session.php 中的 Session Cookie 名称

【讨论】:

    【解决方案5】:

    您需要更新会话配置以在包括子域在内的域范围内保持会话。请按照以下步骤操作。

    1. 转到 config/session.php 并将前缀为 .domain 更新为 config => '.your-domain.com' .

    2. 然后清除应用程序缓存,打开 Chrome DevTool 并转到 应用程序 > 应用程序 > 清除存储。您还需要清除之前的 cookies

    3. 运行 artisan 命令 php artisan config:cachephp artisan config:clear 以删除之前缓存的 laravel 应用程序配置。

    如果您使用 database 作为会话驱动程序,您需要为此创建一个会话表。运行命令 php artisan session:table 生成会话表迁移,然后使用 php artisan migrate 进行迁移。然后执行上面给出的三个步骤。

    【讨论】:

    • 清空存储对开发者来说很好,但是当我们推送到生产环境时用户应该怎么做呢?
    • 你需要忘记所有的cookies,如果你有网站在生产中,那么你可以部署一些东西来清除所有请求的客户端cookies。
    • 感谢您的快速回复!已清除的会话、配置和缓存仍然无法正常工作。不确定我们应该为用户清除哪些 cookie
    • 您需要清除会话 cookie 以避免使用旧配置创建的旧会话。
    • 想确认是否需要协议(http://或http://)或直接域名
    【解决方案6】:

    使用 Laravel 8 变得更加简单:

    SESSION_DOMAIN 添加到您的 .env 文件中:

    SESSION_DOMAIN=.yourdomain.tld
    

    清除配置缓存:

    php artisan config:cache
    

    删除您的浏览器会话 cookie,然后会话将在您的所有子域之间共享。

    在我的情况下,一旦在 www 上创建帐户,我就会自动登录用户到子域。领域。工作正常。

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 2015-12-06
      • 2012-12-14
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2014-09-08
      相关资源
      最近更新 更多