Laravel Sanctum发送XSRF-TOKEN仍遇419 CSRF令牌不匹配问题求助
解决Laravel Breeze API部署子目录后的419 CSRF错误
以下是针对你遇到的问题的具体排查和解决步骤:
1. 核对Sanctum的子目录适配配置
- 打开
config/sanctum.php,检查stateful数组,把你的前端主域名加进去(比如['yourdomain.com'],不用带/frontend子目录)。 - 确认
prefix保持默认的'sanctum',同时前端请求CSRF的路径必须是后端子目录完整路径:/laravel-breeze-api/sanctum/csrf-cookie,别直接请求根目录下的sanctum/csrf-cookie。
2. 修正Cookie的域名与路径设置
- 打开
.env,把SESSION_DOMAIN设为你的主域名(比如.yourdomain.com,开头的点要加上,这样子目录也能读取Cookie),别设置成带子目录的路径。 - 确保
SESSION_PATH在config/session.php里是默认的'/',这样Cookie能在整个域名下生效,不会被限制在后端子目录里。 - 用浏览器开发者工具查看「Application→Cookies」,检查
XSRF-TOKEN和laravel_session的Domain是不是主域名,Path是不是/。如果Path是/laravel-breeze-api,前端子目录读不到,得调整Laravel的session配置。
3. 检查前端请求的配置细节
- 前端请求login接口时,必须用完整路径:
/laravel-breeze-api/login,别用相对路径或者错误的根路径。 - 如果用axios,一定要开启
withCredentials: true,并且把baseURL设为后端子目录的完整URL(比如https://yourdomain.com/laravel-breeze-api),让axios自动从Cookie里取X-XSRF-TOKEN,别手动拼接请求头。示例代码:axios.defaults.withCredentials = true; axios.defaults.baseURL = 'https://yourdomain.com/laravel-breeze-api'; - 查看login请求的Network面板,确认Request Headers里有
X-XSRF-TOKEN,且值和Cookie里的XSRF-TOKEN一致,同时Cookie头包含这两个Cookie。
4. 适配共享主机的URL重写规则
- 后端
laravel-breeze-api目录下的.htaccess要调整RewriteBase,适配子目录:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /laravel-breeze-api/ RewriteRule ^(.*)$ public/$1 [L] </IfModule> - 要是共享主机没开HTTPS,把
.env里的SESSION_SECURE_COOKIE设为false(生产环境务必开启HTTPS),不然Cookie无法正常存储。
5. 确认CORS配置正确
- 打开
config/cors.php,paths要包含['api/*', 'sanctum/csrf-cookie'],allowed_origins设为前端的完整URL(比如https://yourdomain.com/frontend),supports_credentials必须设为true。 allowed_methods要覆盖GET, POST, PUT, DELETE,allowed_headers要包含X-XSRF-TOKEN。
最后验证
查看Laravel的日志文件storage/logs/laravel.log,里面会有CSRF错误的具体原因,比如token不匹配的细节,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Sourav Malo
相关产品推荐
相关产品推荐

