Laravel 8搭配Inertiajs重定向时如何保留URL末尾的哈希值
问题原因
你调用的withFragment方法在Laravel端逻辑是完全正常的,哈希丢失的根源是Laravel 8配套的低版本Inertia.js(v0.x版本)的重定向处理逻辑:Inertia默认处理后端返回的重定向响应时,只会提取URL的路径、查询参数部分,会主动丢弃哈希片段,所以才会出现你遇到的问题。
修复方法
这里提供两种适配不同场景的解决方案:
方案1:走原生浏览器重定向(最简单快速)
直接将哈希拼接在URL末尾,使用away方法生成外部重定向响应,Inertia遇到这类响应会直接调用浏览器原生重定向逻辑,哈希会被完整保留:
// 替换原有重定向代码即可 $url = url("/questions/{$question->slug}#{$newAnswer->id}"); return redirect()->away($url);
注意:该方案会触发页面全量刷新,丢失Inertia单页应用的无刷新跳转体验。
方案2:前端手动拼接哈希(保留单页体验)
如果要保留Inertia的无刷新跳转特性,可以通过闪存参数传递哈希值,前端主动设置:
- 后端修改重定向逻辑,通过
with方法闪存哈希值:
return redirect($url)->with('answer_fragment', $newAnswer->id);
- 在对应问题详情的React组件中,读取Inertia传递的闪存参数,挂载时手动设置哈希:
import { usePage } from '@inertiajs/inertia-react' import { useEffect } from 'react' function QuestionDetail() { const { answer_fragment } = usePage().props useEffect(() => { if (answer_fragment) { window.location.hash = answer_fragment } }, [answer_fragment]) // 页面其余业务逻辑 }
内容的提问来源于stack exchange,提问作者Michael Cook
相关产品推荐
相关产品推荐

