Laravel中AJAX请求已携带CSRF Token仍报不匹配错误排查
以下是针对你遇到问题的具体排查和解决方向:
确认Token获取有效性
先检查浏览器控制台打印的CSRF_TOKEN值,是否和页面源码中<meta name="csrf-token">标签的content属性值完全一致。如果控制台输出为空或不一致,要么是jQuery未加载完成就执行了代码,要么是meta标签的name属性拼写错误。验证请求实际发送参数
打开浏览器开发者工具(F12)→ 切换到Network标签,找到/newsletter的POST请求,查看Form Data里的_token值是否和页面的CSRF Token一致。如果参数中_token缺失或值错误,会直接导致验证失败。检查路由中间件归属
确保/newsletter路由定义在routes/web.php中(默认包含web中间件组,自带CSRF验证)。如果路由误放在routes/api.php中,又手动添加了VerifyCsrfToken中间件,也会触发报错。尝试改用请求头传递Token
表单参数传递Token可能存在编码或解析问题,可以取消代码中headers行的注释,改用请求头方式传递,同时可移除data中的_token参数(两种方式二选一即可):headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},排查Session配置与缓存
Laravel的CSRF验证依赖Session,若Session驱动配置异常(如file驱动对应的storage/framework/sessions目录无写入权限),会导致Token无法正常验证。同时可执行以下命令清除框架缓存:php artisan cache:clear php artisan config:clear php artisan route:clear也可尝试清除浏览器Cookie后重新测试。
用户提供的相关代码:
<head> <meta name="csrf-token" content="{{ csrf_token() }}" /> </head> <form id="formId"> <input id="news_letter_mail" name="email" class="form-control" placeholder="Entrez votre E-mail *" /> <div class="call_to_action mb-4"> <a href="#" id="newsletter"> <button >Envoyer un Message</button> </a> <span><i class='bx bx-right-arrow-alt'></i></span> </div> </form> <script> $("#newsletter").click(function(event){ event.preventDefault(); var name="moussa"; var email="moussaeloifi14@gmail.com"; var message="ok"; var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content'); console.log(CSRF_TOKEN); $.ajax({ url: '/newsletter', type: 'POST', dataType: 'json', // headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, data:{_token: CSRF_TOKEN,name: name,email: email,message: message}, success: function(response){ console.log(response); }, error: function (error) { } }); }); </script>
内容的提问来源于stack exchange,提问作者moussa

