Laravel 5迁移服务器后单页面出现TokenMismatchException问题求助
先看你提供的表单代码,我发现一个很容易忽略的语法错误:
<form action="{{url('video/upload')}}", id="qq-form">
这里action属性值后面多了一个逗号,浏览器会把这个逗号解析成URL的一部分,导致实际请求的地址变成video/upload,(带逗号),而你的后端路由应该是video/upload——不匹配的路由请求会触发CSRF验证失败。先把这个逗号去掉,修正后的代码如下:
<form action="{{url('video/upload')}}" id="qq-form"> <input name="_token" type="hidden" value="{{ csrf_token() }}" /> </form>
如果去掉逗号后问题仍未解决,再逐一排查以下几个方向:
确认表单提交方式与路由匹配:检查
video/upload路由定义的请求方法(Laravel默认只对POST/PUT/DELETE等非GET请求做CSRF验证),确保表单的method属性和路由定义一致,比如路由是POST,表单就要写method="POST"。AJAX提交的特殊处理:如果这个表单是通过AJAX提交的,要确认token是否被正确携带。有些AJAX库不会自动读取表单里的隐藏域,你可以手动把token加入请求数据,或者全局配置请求头:
// 示例:jQuery AJAX手动携带token $.ajax({ url: "{{url('video/upload')}}", type: 'POST', data: { _token: "{{ csrf_token() }}", // 其他表单字段 }, success: function(res) { // 处理响应 } });或者全局设置AJAX请求头(记得先在页面头部添加meta标签):
<meta name="csrf-token" content="{{ csrf_token() }}">$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });验证会话与token一致性:在页面渲染时直接输出
{{ csrf_token() }},同时在后端用Session::get('_token')打印会话中的token,对比两者是否一致。如果不一致,可能是页面缓存未彻底清除,可以尝试强制刷新页面(Ctrl+F5)再测试。检查路由中间件:确认这个页面的路由没有被意外排除在Web中间件之外——Web中间件负责启动会话和CSRF验证,如果路由跳过了这个中间件,也可能导致异常。
从你的描述来看,其他表单都正常,说明全局CSRF配置、权限和缓存没有问题,单个表单的语法错误大概率是问题根源,先修正逗号再测试应该能解决。
内容的提问来源于stack exchange,提问作者Jensej

