【问题标题】:Laravel redirect back leading to redirect loopLaravel 重定向返回导致重定向循环
【发布时间】:2015-11-09 18:10:48
【问题描述】:

当用户尝试访问该用户不允许的 url /product/{product_id}/edit 时,我添加了一个重定向回上一个 URL 和一条消息,

public function edit($product_id)
{
...
return redirect()->back()->with(['error' => 'No permission']);
...
}

当用户点击链接(标签)时,它会重定向回以前的 url 并出错。但是当用户尝试输入 URL /product/12/edit 时,它会一直重定向到相同的 url 并成为重定向循环。

如何正确解决这个问题,是不是和laravel的bug?

【问题讨论】:

    标签: php laravel laravel-5 laravel-routing laravel-5.1


    【解决方案1】:

    如果用户点击一个链接,当前 URL 将作为 'HTTP_REFERER' 传递,laravel 使用它来重定向回来,但如果用户直接在浏览器地址栏中键入链接,则不会有 'HTTP_REFERER' 并因此重定向循环。

    您可以使用route 重定向到

    return redirect(route('product.index'))->with(['error' => 'No permission']);
    

    因此用户将始终被重定向到索引页面。

    【讨论】:

    • 有什么方法可以获取之前对 Laravel 的非 ajax 请求?
    • @JithinJose 不太明白你的问题 :-)
    • 我想重定向回该用户之前的请求 url,不包括任何 ajax 请求。
    【解决方案2】:

    重定向返回应该如下:

    return redirect()->back()->with('error', 'No permission');
    

    参考:larave doc

    【讨论】:

    • 如果我们加载没有HTTP_REFERER头的页面将无法正常工作,它会重定向到同一页面并最终成为重定向循环。
    【解决方案3】:

    如果没有找到 HTTP_REFERER,Laravel 会将用户重定向到相同的 url。 为了避免无限循环,我使用了这种方法:

    $referer = Request::header('referer');
    if(empty($referer)) {
      return Redirect::to(route('defaultRoute'));
    } else {
      return Redirect::back();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2016-06-15
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多