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 重定向返回导致重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Laravel 7 重定向导致 405 错误?

重定向到子域会导致重定向循环错误

web.config 重定向到 https 导致重定向循环

Laravel 4 htaccess 重定向循环 2

Laravel 5 中间件 https 上的 aws ec2 重定向循环

返回重定向()->动作('BookingController@index')laravel 8