Laravel 4中Redirect::back()返回空URL,需实现登录后重定向至用户输入URL
解决认证后重定向至用户初始输入URL的问题
你当前的代码没有记录用户原本想要访问的目标URL,而且Redirect::back()在用户直接访问登录页的场景下会返回空URL,这就是核心问题所在。下面是完整的解决方案:
步骤1:未认证时保存目标URL到Session
修改你的index方法,当检测到用户未认证时,先把当前请求的完整URL存入Session,再返回登录视图,这样就能记住用户最初想访问的页面:
public function index() { if(!Auth::check()) { // 保存用户原本要访问的完整URL到session session()->put('url.intended', request()->fullUrl()); return View::make('adminLogin'); } return Redirect::to('admin'); }
步骤2:登录成功后重定向至目标URL
修改login方法,在验证通过、登录成功后,使用Redirect::intended()方法——这个方法会自动读取我们存在Session里的目标URL,优先跳转到那里;如果Session里没有记录(比如用户直接访问登录页),则跳转到你指定的默认页面(这里是admin):
public function login() { $creds = array( 'username' => Input::get('username'), 'password' => Input::get('password') ); if (Auth::attempt($creds)) { // 优先跳转到用户最初想访问的URL,否则跳转到admin页面 return Redirect::intended('admin'); } else { // 登录失败时返回登录页,保留用户输入并提示错误 return Redirect::back()->withInput()->withErrors(['login' => '用户名或密码错误']); } }
修复Redirect::back()返回空URL的问题
如果在登录失败场景下仍然想用Redirect::back(),可以给它添加一个兜底跳转地址,避免出现空URL的情况:
// 替代原来的Redirect::back(),为空时跳转到admin页面 return Redirect::back()->fallback(route('admin'))->withInput()->withErrors(...);
方案说明
session()->put('url.intended', ...):专门存储用户想要访问的目标URL,Laravel的intended方法会自动读取这个Session键值。Redirect::intended():Laravel内置的适配方法,完美解决“登录后跳转到原页面”的场景,比手动处理Session更可靠。fallback():为back()方法提供安全兜底,当没有上一页的记录时,会跳转到指定的默认地址。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

