You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Sanctum SPA认证时Cookie无法设置(Set-Cookie因Domain属性无效被拦截)求助

Laravel Sanctum SPA认证时Cookie无法设置(Set-Cookie因Domain属性无效被拦截)求助

我之前也碰到过一模一样的问题,折腾了好一会儿才找到根源,给你几个排查和解决的方向,应该能帮到你:

1. 先排查域名一致性问题

你现在的axios配置用的是http://127.0.0.1:8000,但Laravel的.env里APP_URL是http://localhost:8000——对浏览器来说,127.0.0.1和localhost是两个完全不同的域名!这会导致API返回的Set-Cookie头里的Domain是localhost,但请求来自127.0.0.1,浏览器直接判定跨域,不会保存Cookie。

解决方法:把axios的baseURL改成和APP_URL一致:

const api = axios.create({
    baseURL: 'http://localhost:8000', // 和APP_URL统一用localhost
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Accept': 'application/json',
    },
    withCredentials: true,
});

2. 修正SESSION_DOMAIN的配置

你现在设置了SESSION_DOMAIN=localhost,但浏览器对localhost这个特殊域名的Cookie处理有规则:当Domain设为localhost时,跨端口的请求(比如3000和8000)有时候会被浏览器拦截,因为它不识别带端口的localhost为同域。

解决方法:把.env里的SESSION_DOMAIN留空或者直接注释掉:

APP_URL=http://localhost:8000
SANCTUM_STATEFUL_DOMAINS=localhost:3000
SESSION_DOMAIN= # 留空,让Laravel自动处理

Laravel会自动根据请求的域名生成正确的Cookie Domain,这样跨端口的请求就能正常识别了。

3. 确认CORS配置是否正确

Laravel的CORS设置必须允许携带凭证,否则浏览器会拒绝保存Cookie。打开config/cors.php,确保以下配置正确:

return [
    'paths' => ['api/*', 'sanctum/csrf-cookie'], // 要包含sanctum的csrf接口
    'allowed_methods' => ['*'],
    'allowed_origins' => ['http://localhost:3000'], // 允许你的React域名
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true, // 这个必须设为true,允许携带Cookie
];

4. 清除浏览器缓存和旧Cookie

有时候之前错误配置留下的旧Cookie会干扰新的Cookie设置,建议打开浏览器的开发者工具(F12),在Application面板里找到Cookie,清空localhost和127.0.0.1下的所有Cookie,然后重启浏览器再测试。

做完这些步骤后,重新发送api.get('/sanctum/csrf-cookie')请求,再去Application->Cookies->localhost:8000里看看,应该就能看到Laravel生成的SESSION和XSRF-TOKEN Cookie了。

备注:内容来源于stack exchange,提问作者youness serra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 07:14:38