Laravel 5.6生产环境表单提交提示页面过期问题求助
哥们,我之前部署Laravel项目到生产环境时也碰到过一模一样的“页面因过期失效”问题,结合你的情况,给你几个针对性的排查和解决方法:
先确认CSRF令牌是否正常输出
使用Laravel Collective Form时,Form::open()方法默认会自动生成_token隐藏字段,但有时候可能因为配置问题没生成。你可以打开页面源码,搜索是否存在<input type="hidden" name="_token" value="xxx">这行代码,并且value值是一串随机字符串。如果没有,手动在表单里添加{!! Form::token() !!}试试。检查Session存储目录的权限和所有者
虽然你已经设置了777权限,但生产环境更推荐用更安全的权限配置,同时要确保目录所有者是web服务器的运行用户(Ubuntu上一般是www-data):sudo chown -R www-data:www-data storage/framework/sessions sudo chmod -R 775 storage/framework/sessions另外,检查
.env文件里的SESSION_DRIVER配置,如果是file驱动,确保storage/framework/sessions目录存在且可写;如果用redis或database驱动,要确认对应的服务配置正确。验证HTTPS与环境配置的一致性
如果你的生产环境用了HTTPS,一定要确保:.env里的APP_URL是以https://开头的完整域名.env里的SESSION_DOMAIN设置为你的生产域名(比如yourdomain.com,不要带http/https)- 服务器没有拦截请求的
Referer头,Laravel的CSRF验证会校验Referer是否合法,HTTPS环境下这个校验更严格。
同步服务器系统时间
CSRF令牌有有效期,如果服务器时间和真实时间偏差过大,会导致令牌提前失效。在AWS Ubuntu上可以用以下命令开启时间同步:sudo timedatectl set-ntp on执行后可以用
timedatectl status确认时间是否同步正常。重新生成配置缓存
你已经执行过清缓存命令,但生产环境需要重新生成优化后的缓存:php artisan config:cache php artisan route:cache注意执行这两个命令前,一定要确保
.env里的所有配置都是正确的,因为缓存生成后会直接读取缓存文件,不再加载.env的实时修改。
如果以上方法都试过还是不行,可以临时在app/Http/Middleware/VerifyCsrfToken.php的$except数组里添加你的表单路由(比如protected $except = ['your-form-route'];),排查是不是CSRF验证的问题,但这只是临时测试,不要长期保留这个配置,会有安全风险。
内容的提问来源于stack exchange,提问作者trojan

