Laravel+Inertia项目生产环境火狐浏览器Inertia渲染失效如何解决?
问题报错信息
All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.

适配Firefox的解决方案
1. 校验后端响应逻辑
- 确认所有对应
inertia-link跳转的路由,没有强制返回普通JSON的代码,必须使用inertia()助手或Inertia::render()返回响应。 - 确认
HandleInertiaRequests中间件已全局注册,没有被其他中间件拦截篡改响应。 - 新增判断逻辑:只要请求携带
X-Inertia头,就必须返回Inertia格式响应,不可直接返回JSON。
2. 修正缓存适配逻辑
Firefox的缓存策略与Chromium内核浏览器不同,会缓存XHR请求导致返回非预期的旧JSON响应,可通过添加响应头禁用Inertia请求的缓存:
在HandleInertiaRequests中间件中添加如下代码:
public function handle(Request $request, Closure $next) { $response = parent::handle($request, $next); if ($request->header('X-Inertia')) { $response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate'); $response->headers->set('Pragma', 'no-cache'); $response->headers->set('Expires', '0'); } return $response; }
也可以在前端给所有Inertia请求加时间戳参数禁用缓存:
import { Inertia } from '@inertiajs/inertia' Inertia.on('start', (event) => { event.detail.visit.url.searchParams.append('_t', Date.now()) })
3. 修复重定向与异常处理逻辑
- 涉及权限校验、登录跳转等重定向场景时,直接使用Laravel自带的
redirect()方法返回即可,不要自定义302响应后接JSON内容。 - 调整全局异常处理器,针对携带
X-Inertia头的请求,走默认的Laravel异常响应逻辑,不要强制返回JSON格式的错误信息:
public function render($request, Throwable $exception) { if ($request->header('X-Inertia')) { return parent::render($request, $exception); } // 普通请求的自定义异常处理逻辑 }
内容的提问来源于stack exchange,提问作者luis villalta
相关产品推荐
相关产品推荐

