Laravel 5.5部署GoDaddy服务器提交表单遇TokenMismatchException求助
解决Laravel 5.5在GoDaddy服务器上的CSRF TokenMismatchException问题
嘿,我之前在GoDaddy部署Laravel应用时也碰到过一模一样的问题,给你几个针对性的排查和解决方向,应该能搞定:
检查表单中的CSRF令牌是否正确生成
确保你的联系表单里包含了Laravel 5.5支持的@csrf指令(或者旧版的{{ csrf_field() }}),打开页面源码查看是否有一个名为_token的隐藏input字段,并且它的值是存在的。如果是AJAX提交表单,一定要在请求头里带上X-CSRF-TOKEN,可以通过页面中<meta name="csrf-token" content="{{ csrf_token() }}">这个标签获取令牌值,再设置到AJAX请求的header中。调整会话配置的关键参数
GoDaddy的服务器环境有些特殊,默认的会话配置可能不适用:- 检查
config/session.php里的'path'项,默认的'/tmp'在GoDaddy上可能存在权限问题,可以改成storage/framework/sessions,同时确保这个文件夹的权限设置为755(别用777,不安全且部分服务器会限制这类权限目录)。 - 确认
'domain'配置,如果你的应用有子域名,要设置为.yourdomain.com(注意前面的点),单域名的话可以留空或者设置为当前域名。 - 检查
.env文件中的SESSION_DRIVER,如果是database驱动,要确保已经执行过php artisan session:table和迁移命令,会话表正常存在。
- 检查
彻底清除缓存和会话文件
缓存或者旧的会话文件也可能导致令牌不匹配:- 如果有SSH权限,直接在服务器上执行以下命令:
php artisan cache:clear php artisan config:clear php artisan route:clear rm -rf storage/framework/sessions/* - 没有SSH权限的话,可以临时添加一个清除缓存的路由,上传到服务器后访问一次,之后记得删除这个路由:
Route::get('/clear-all-cache', function() { \Illuminate\Support\Facades\Artisan::call('cache:clear'); \Illuminate\Support\Facades\Artisan::call('config:clear'); \Illuminate\Support\Facades\Artisan::call('route:clear'); \Illuminate\Support\Facades\File::cleanDirectory(storage_path('framework/sessions')); return '缓存和会话已清除!'; });
- 如果有SSH权限,直接在服务器上执行以下命令:
检查GoDaddy的PHP和缓存配置
GoDaddy默认的一些配置可能干扰CSRF令牌的正常传递:- 在
public/.htaccess文件中添加以下内容,禁用页面缓存,避免令牌被缓存:<IfModule mod_headers.c> Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </IfModule> - 确认
SESSION_SECURE_COOKIE的设置:如果你的网站启用了HTTPS,这个值应该设为true;如果是HTTP则设为false,GoDaddy的HTTPS跳转有时候会导致cookie的secure属性不匹配,进而丢失会话。
- 在
确保表单提交的协议和方法正确
- 表单的提交方法必须是
POST(CSRF验证只针对POST/PUT/DELETE等非GET请求),别误用了GET方法。 - 尽量保持整个网站使用统一的协议(要么全HTTP,要么全HTTPS),跨协议提交表单会导致会话cookie丢失,从而引发令牌不匹配问题。
- 表单的提交方法必须是
内容的提问来源于stack exchange,提问作者Saurabh Mistry
相关产品推荐
相关产品推荐

