Laravel 8站点根目录非/时,如何保存路径并实现后续重定向?
在Laravel中可靠保存路径并重定向的方法
当站点根目录不是/(比如/path_to_site/)时,手动拼接路径容易出现重复根目录的问题,以下是几种可靠的解决方式:
方案1:直接保存完整URL
这种方式最简单,完全避免路径解析错误:
// 保存当前请求的完整URL到session session(['intended_url' => $request->fullUrl()]); // 后续重定向时直接使用保存的完整URL return redirect(session('intended_url', config('app.url')));
redirect()方法会自动识别绝对URL,不会额外拼接站点根目录,完美适配非根目录部署的场景。
方案2:提取相对于站点根的路径
如果只需要保存相对路径,可以先解析站点根目录,再提取相对路径:
// 获取应用配置的根URL并解析路径部分 $appUrlParts = parse_url(config('app.url')); $appRootPath = $appUrlParts['path'] ?? '/'; // 解析当前请求的路径和查询参数 $requestUrlParts = parse_url($request->fullUrl()); $requestFullPath = $requestUrlParts['path'] . (isset($requestUrlParts['query']) ? '?' . $requestUrlParts['query'] : ''); // 计算相对于站点根的路径 if ($appRootPath !== '/' && str_starts_with($requestFullPath, $appRootPath)) { $relativePath = substr($requestFullPath, strlen($appRootPath)); } else { $relativePath = $requestFullPath; } // 确保路径以/开头,避免相对路径错误 if (!str_starts_with($relativePath, '/')) { $relativePath = '/' . $relativePath; } // 保存到session session(['intended_url' => $relativePath]); // 重定向时使用相对路径 return redirect(session('intended_url', '/'));
方案3:利用Laravel的intended方法
如果你是在登录场景(即使自定义登录逻辑),可以手动设置url.intendedsession键,然后使用内置方法:
// 保存目标路径到Laravel默认的intended键 session(['url.intended' => $request->fullUrl()]); // 重定向到目标路径,默认回退到首页 return redirect()->intended('/');
这个方法是Laravel内置的登录后重定向逻辑,天然支持非根目录部署场景。
内容的提问来源于stack exchange,提问作者asdflkadslkfadsfjasdadsfsad
相关产品推荐
相关产品推荐

