laravel - 登录重定向丢失 url 哈希

Posted

技术标签:

【中文标题】laravel - 登录重定向丢失 url 哈希【英文标题】:laravel - login redirect loses the url hash 【发布时间】:2017-03-31 23:37:09 【问题描述】:

当我想从我的网站分享一个页面 url,比如 mysite.com/page1#foo=bar,或者想在我退出后访问这个页面时,我被重定向到 login 表单,因为 page1 路由在 @987654324 中@。

我的问题是我登录成功后被重定向到mysite.com/page1,并且丢失了hash值。

(哈希值也没有保存在/login上)

Laravel 有没有提供简单的方法来保存哈希? 由于哈希没有发送到服务器,我有点怀疑,但也许我在某个地方错过了一些东西!

否则我需要覆盖登录,也许用 JS 读取哈希并在登录后以某种方式将其重新注入到重定向中,但如果有简单的方法,我很想避免这样做:)

【问题讨论】:

是的,我正要说#fragment 没有发送到服务器。由于中间件在您能够执行任何客户端代码之前启动并重定向您,我不确定您将如何去做。我认为绕过它的方法是删除中间件并在检测到需要重定向时使用 JS 将片段传递给服务器。 或者,您可以更改 auth 中间件,使其不会重定向,而是返回一个视图,然后您可以在其中添加客户端代码,保留片段,然后执行使用 JS 的重定向。 听起来不错!我会调查并尝试找到一种方法来做到这一点!如果我能联系到/login#foo=bar,我应该很高兴! 【参考方案1】:

多亏了 Mruf 的指导,我才得以查明真相。 不确定这是不是最好的实现,但它似乎正在工作。

基本上我按照Mruf建议的形式插入hash值,然后在AuthController中扩展handleUserWasAuthenticated函数

login.blade.php

<script type="text/javascript" >
  $( document ).ready(function() 
    $('.urlHash').val(window.location.hash);
  );
</script>

<form id="login-form" role="form" method="POST" action=" url('/login') ">
  <input type="hidden" class="form-control urlHash" name="urlHash" value="">
  ....
</form>

AuthController.php

protected function handleUserWasAuthenticated(Request $request, $throttles)

    if ($throttles) 
        $this->clearLoginAttempts($request);
    

    if (method_exists($this, 'authenticated')) 
        return $this->authenticated($request, Auth::guard($this->getGuard())->user());
    

    // old code: return redirect()->intended($this->redirectPath());

    $newRequest = redirect()->intended($this->redirectPath());
    $newRequest->setTargetUrl($newRequest->getTargetUrl() . $request->urlHash);

    return $newRequest;

【讨论】:

【参考方案2】:

一个简单的 JavaScript 就可以解决问题:

$("#login-form").submit(function()
    e.preventDefault();
    $(this).append("<input type='hidden' name='hash' value='"+window.location.hash+"'");

    $(this).submit();
);

现在您可以访问请求对象中的哈希

function controllerAction(Request $request)
    $hash = $request->get("hash");
    // Parse Hash
    ....
    // Redirect to somewhere
    ....

【讨论】:

我正在考虑做类似的事情,但这只是我认为的 50% 的过程。您的解决方案意味着我在 /login#foo=far 上,但我不是。不过,一旦我到达那里,您的解决方案应该可以解决问题! 看起来我在测试不同的 url 时感到困惑。看起来它实际上正在重定向到/login#foo=bar,因此它保留了哈希值,我应该能够测试您的解决方案! 另一种解决方案是$(window).on('hashchange',function()//submit hash with ajax to server);,所以当哈希值改变时,你总是将它提交给服务器并在会话中持续存在。它未经测试,所以...

以上是关于laravel - 登录重定向丢失 url 哈希的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 登录后重定向到自定义 url

如何使 Laravel 5 重定向到没有哈希(#)的 Angular 路由?

在 laravel 5.6.3 中更改登录的重定向 url

如何将用户重定向到以前的URL在Laravel中注册后

Laravel 路由组导致重定向循环

指定URL时,Laravel无法重定向