Laravel - 登录重定向丢失URL哈希

7
当我想分享我的网站页面链接,比如mysite.com/page1#foo=bar,或者当我已注销登录时想访问这个页面时,我会被重定向到login表单,因为page1路由在auth middleware中。
我的问题是,在成功登录后,我被重定向到mysite.com/page1并且我失去了哈希值。
(哈希值也不保留在/login
Laravel是否提供了任何简单的方法来保持哈希值? 由于哈希值未发送到服务器,我有点怀疑,但也许我错过了某些东西!
否则,我需要重写登录,也许使用JS读取哈希值,并以某种方式在登录后重新注入它,但如果有简单的方法,我很想避免这样做 :)

2
是的,我正要说#fragment不会被发送到服务器。由于中间件在你能够执行任何客户端代码之前就会启动并重定向你,所以我不确定你该如何处理它。我认为解决这个问题的方法是删除中间件,并在检测到需要重定向时使用JS将片段传递到服务器。 - Jonathon
1
或者,您可以更改auth中间件,使其不进行重定向,而是返回一个视图,在其中您可以添加客户端代码,保留片段,然后使用JS执行重定向。 - Jonathon
听起来是个不错的方法!我会调查并尝试找到一种实现的方式!如果我能够到达/login#foo=bar,那么我就可以继续了! - mokk
2个回答

4
感谢Mruf的指导,我终于搞明白了。虽然我不确定这是否是最佳实现方式,但似乎它正在起作用。
基本上,我按照Mruf的建议在表单中插入哈希值,然后扩展了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;
}

3
一个简单的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上,但事实并非如此。不过一旦我到达那里,你的解决方案应该就可以奏效了! - mokk
看起来我在测试不同的URL时把自己搞糊涂了。实际上它似乎重定向到/login#foo=bar,因此由于它保留了哈希值,我应该能够测试您的解决方案! - mokk
另外一个解决方案是 $(window).on('hashchange',function(){//submit hash with ajax to server}); ,这样当哈希值改变时就会将其提交到服务器并在会话中保持。这还未经过测试,所以... - Mruf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接