Laravel 重定向返回导致重定向循环
Posted
技术标签:
【中文标题】Laravel 重定向返回导致重定向循环【英文标题】:Laravel redirect back leading to redirect loop 【发布时间】: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?
【问题讨论】:
【参考方案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();
【讨论】:
以上是关于Laravel 重定向返回导致重定向循环的主要内容,如果未能解决你的问题,请参考以下文章