Laravel中Inertia.get()触发409错误,router.get()可正常运行
Laravel + Vue + Inertia 中 Inertia.get() 触发409错误(缺少x-inertia-version请求头)的解决方法
问题场景
调用Inertia.get()接口时,服务器先返回409 Conflict错误,之后才重定向到目标页面。抓包发现请求带了x-inertia:true头,但未携带x-inertia-version头;改用router.get()则完全正常,能自动带上版本头。
原因
Inertia内置版本校验机制,服务器会校验请求的x-inertia-version是否与当前应用版本一致,不一致则返回409触发客户端刷新。正常情况下Inertia.get()应该自动注入版本头,出现这个问题大概率是版本同步异常或调用配置缺失。
解决方法
1. 手动在请求中添加版本头
通过usePage()获取当前页面的版本,手动加到请求头里:
<script setup> import { Inertia, usePage } from '@inertiajs/vue3'; // ...其他导入 const page = usePage(); const props = defineProps({ title: String, data: Object, }) const getData = (country)=> { Inertia.get(`/country/${country.name}/${country.code}`, {}, { preserveState: true, headers: { 'X-Inertia-Version': page.version, }, }); } </script>
2. 改用Inertia Router的router.get()
既然router.get()能自动处理版本头,直接替换调用方式即可:
<script setup> import { router } from '@inertiajs/vue3'; // ...其他导入 const getData = (country)=> { router.get(`/country/${country.name}/${country.code}`, {}, { preserveState: true, }); } </script>
3. 校验前后端Inertia版本兼容性
检查前端@inertiajs/inertia、@inertiajs/vue3和后端laravel/inertia的版本是否匹配,版本差异可能导致自动注入头的逻辑失效。可以执行以下命令更新到兼容版本:
# 前端更新 npm update @inertiajs/inertia @inertiajs/vue3 # 后端更新 composer update laravel/inertia
4. 检查Inertia初始化配置
确保前端初始化时正确设置版本逻辑,比如在main.js中:
import { createApp, h } from 'vue' import { createInertiaApp } from '@inertiajs/vue3' createInertiaApp({ resolve: name => import(`./Pages/${name}.vue`), setup({ el, App, props, plugin }) { return createApp({ render: () => h(App, props) }) .use(plugin) .mount(el) }, // 确保版本自动生成(默认用Vite/mix的构建哈希) version: () => import.meta.env.VITE_APP_VERSION || window.inertiaVersion, })
后端HandleInertiaRequests中间件保持默认版本逻辑即可:
// app/Http/Middleware/HandleInertiaRequests.php public function version(Request $request) { return parent::version($request); }
验证
修改后重新编译前端,发起请求时查看请求头是否包含x-inertia-version,确认409错误是否消失。
内容的提问来源于stack exchange,提问作者monkeytrick
相关产品推荐
相关产品推荐

