ThinkPHP跳转分两类:success/error带提示页跳转(默认dispatch_jump.tpl,支持自定义模板和参数),redirect直接HTTP重定向(302,推荐日常使用,可链式with()传闪存消息);常见失败因响应头已发送、中间件误用或API场景不当。

ThinkPHP控制器里跳转和重定向,核心就两个方向:带提示的页面跳转(success/error),和不带提示的直接重定向(redirect)。用对方法、避开常见坑,基本就能稳住跳转逻辑。
用 success 和 error 显示提示再跳转
这两个方法会先渲染一个中间提示页(默认是 dispatch_jump.tpl),等几秒后自动跳转,适合用户操作反馈场景:
-
$this->success('操作成功', 'user/profile', 2);→ 显示成功信息,2秒后跳到 user/profile -
$this->error('参数错误', 'javascript:history.back(-1)');→ 错误提示,默认3秒后返回上一页;可传任意合法 URL 或 JS 语句 - 跳转地址不填时:
success默认回上一页(HTTP_REFERER),error默认执行history.back() - 模板里能用
$message、$jumpUrl、$waitSecond等变量自定义样式,项目中建议把模板放到public/success.html这类路径并配置dispatch_success_tmpl
用 redirect 直接 HTTP 重定向(推荐日常使用)
这是最轻量、最标准的跳转方式,底层发 302 响应头,浏览器立即跳转,不经过中间页:
-
return redirect('index/index');→ 跳到当前应用的 index 控制器 index 操作 -
return redirect('@admin/dashboard');→ 跳到命名路由(需提前在路由文件中定义别名) -
return redirect('https://example.com');→ 外链必须带http://或https://,否则会被当成相对路径拼接 -
return redirect('order/detail', ['id' => 123, 'name' => urlencode('张三')]);→ 参数自动拼 query,中文务必先urlencode()
配合 Session 闪存消息做提示
redirect 本身不显示文字,但可以和 with() 配合,在下一次请求中读取提示信息:
return redirect('article/list')->with('success', '文章已发布');- 目标控制器或模板中用
{:session('success')}或session('success')读取,仅生效一次 - 支持多条:→
->with('error', '失败')->with('info', '请稍候重试')
跳转失败的常见原因和对策
写了 redirect 却没反应?大概率是响应头已被发送:
- 控制器里有
echo、var_dump或调试输出;开启调试模式时 Trace 信息也会触发输出 - 前置中间件或
__destruct()中调用 redirect —— 此时响应早已结束 - Swoole/RoadRunner 环境下,注意协程间不要并发写响应体
- API 接口里禁用 redirect:前端不会自动跟随 302,应返回 JSON 如
{"code":302,"redirect_url":"/login"},由 JS 处理跳转
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











