每次页面刷新都会生成新的CSRF令牌,导致419页面未找到- Laravel。

4
我几天前将我的网站推向生产环境后就遇到了这个问题。在登录或注册或任何其他POST请求后,它会给我返回“页面未找到419”错误。在本地主机上一切都正常。
已经花费了我4天多的时间进行研究,但我无法想出解决方法。这可能与CSRF验证有关,但是我已经尝试了所有可用的解决方案(未成功)。
我所做的事情:
- 在每个具有POST方法的表单之后,我都加上了@csrf。 - 在head部分中包含了。 - 将.env文件中的SESSION_DOMAIN更改为我的生产域名。 - 清除浏览器缓存并执行以下命令:php artisan cache:clear、php artisan route:clear、php artisan view:clear、php artisan config:clear、php artisan view:cache、php artisan route:cache。 - 使用php artisan key:generate生成了新的APP_KEY。 - 尝试在SESSION_DRIVERS之间切换,从file 改成 database。 - 检查了整个代码中是否存在?<php标签之前的内联空格。 - 为整个文件夹授权777给www-data用户(拼死挣扎的行为)。
我注意到的主要问题是,在本地主机上,csrf令牌只生成一次,并且在页面刷新后保持不变,而在Web服务器上,在每次页面刷新后都会更改。这看起来像是会话无法保存这些信息并导致错误。
这是我的.env文件:
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:s15iIzuybt78V7zZ7cHqcwCRAr1h6YfEWPArlrcqW3A=
APP_DEBUG=false
APP_URL=http://mydomain.tk

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=root
DB_PASSWORD=dbpass

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
SESSION_DOMAIN=http://mydomain.tk

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

我使用的是Laravel框架8.61.0版本和PHP 8.0.10版本。目前唯一有效的解决方案是在config/Kernel.php文件的web部分中注释掉\App\Http\Middleware\VerifyCsrfToken::class这一行代码。但是这并不是我所期望的完全可靠和安全的解决方案。因此我的问题是,是否有其他方法可以调试此问题,或者有哪些解决方案能够帮助我解决这个问题?非常感谢大家。如果你需要了解更多信息,请随时提问。


有人遇到过这个问题吗?你可以尝试跟随此链接 https://dev59.com/UFgQ5IYBdhLWcg3wcTeH#43893114 - Martin Adiputra
1个回答

1

从你的SESSION_DOMAIN中删除http://

如果config('session.domain')的值与你的主机名不匹配,则每个页面加载都会生成一个新的CSRF令牌。

因此,请使用SESSION_DOMAIN=mydomain.tkSESSION_DOMAIN=.mydomain.tk或将其留空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接