Laravel 5.5生产环境POST表单提交提示页面过期问题求助
我之前也碰到过一模一样的问题,结合Laravel 5.5的特性,给你整理了几个靠谱的排查方向,你可以逐一试试:
1. 优先确认Storage目录的读写权限
你怀疑storage文件不可写是完全正确的,这是生产环境下最常见的诱因。Web服务器进程(通常是www-data、nginx或apache用户)需要对storage和bootstrap/cache目录拥有读写权限。
可以通过以下命令修复权限:
# 递归设置目录所有者为Web服务器用户 sudo chown -R www-data:www-data storage bootstrap/cache # 设置安全的目录权限 sudo chmod -R 775 storage bootstrap/cache
如果是共享主机没有sudo权限,可以临时把权限设为777测试(不推荐长期使用),确认是权限问题后再联系主机商调整用户组配置。
2. 检查会话存储路径的有效性
Laravel 5.5用file会话驱动时,默认会话文件存在storage/framework/sessions目录下。如果这个目录不存在或者路径配置错误,会直接导致CSRF令牌验证失败。
- 先确认目录是否存在,不存在就手动创建:
mkdir -p storage/framework/sessions
- 检查
config/session.php里的路径配置是否正确:
'files' => storage_path('framework/sessions'),
3. 清理所有缓存(重点!)
生产环境如果运行过config:cache这类命令,修改的配置可能没同步生效。执行以下命令彻底清理缓存:
# 清理应用缓存 php artisan cache:clear # 清理配置缓存 php artisan config:clear # 清理路由缓存 php artisan route:clear # 清理视图缓存 php artisan view:clear
尤其是你修改过APP_NAME之后,配置缓存大概率没同步,这一步一定要做。
4. 确认APP_KEY配置正确
Laravel的CSRF令牌依赖APP_KEY加密,如果生产环境的APP_KEY和本地不一致,或者根本没设置,会直接触发验证失败。
检查.env文件里的APP_KEY是否是有效的32位字符串,如果没有,执行以下命令生成:
php artisan key:generate
生成后要确保.env里的APP_KEY已更新,再重新清理配置缓存。
5. HTTPS环境下调整SESSION配置
如果生产环境用HTTPS,要确保会话Cookie只通过HTTPS传输:
- 在
config/session.php里设置:
'secure' => env('SESSION_SECURE_COOKIE', false),
- 然后在
.env文件中添加:
SESSION_SECURE_COOKIE=true
6. 验证CSRF令牌是否正确渲染
虽然你说已经加了{{ csrf_field() }},还是建议在浏览器查看页面源码,确认是否生成了正确的隐藏字段:
<input type="hidden" name="_token" value="xxxxxx">
如果没生成,大概率是视图缓存的问题,执行php artisan view:clear后重新加载页面即可。
内容的提问来源于stack exchange,提问作者Luis-Orlando Guzman

