已部署的Laravel Sanctum应用无法运行 共享主机Vue Axios请求报401错误
共享主机部署后Sanctum鉴权401修复方案
先修正代码本身的配置错误
你当前的bootstrap.js存在会直接导致鉴权失效的顺序问题:
- 现有代码先对
window.axios.defaults.withCredentials赋值,但此时window.axios还未完成初始化,只是给临时空对象设置了无效属性;后续require('axios')会把真正的Axios实例覆盖到window.axios上,之前设置的跨域携带Cookie的配置完全不会生效。 - 修正后的配置顺序,必须先引入Axios实例,再设置全局参数:
window.axios = require('axios'); window.axios.defaults.withCredentials = true; window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
对齐生产环境的Sanctum配置
本地环境能正常运行,说明业务逻辑没有核心问题,部署后失效大多是环境配置和线上域名不匹配:
- 检查根目录
.env的核心参数,不能保留本地开发的配置:APP_URL=http://foo.xyz,和实际访问的站点地址完全一致SANCTUM_STATEFUL_DOMAINS=foo.xyz,www.foo.xyz,把所有用户可能访问的域名形式都纳入允许列表,漏写任意一种都会触发鉴权失败SESSION_DOMAIN=.foo.xyz,前面的点号保证主域、www子域之间的Cookie可以共享,避免不同域名形式的Session不互通
- 清理本地缓存后再上传代码:
- 不要把本地
bootstrap/cache目录下的配置、路由缓存文件传到主机,这类文件写死了本地开发环境的地址参数,会直接覆盖生产配置 - 代码上传完成后,在主机端执行
php artisan config:clear、php artisan route:clear、php artisan cache:clear,清除残留的旧缓存
- 不要把本地
- 确认storage目录权限正常:
storage/framework/sessions、storage/framework/cache目录必须对PHP运行用户开放读写权限,权限不足会导致Session无法正常存储,CSRF校验没有匹配的凭证就会返回401。
排查请求链路的异常
你提供的控制台报错显示,请求实际打到了http://foo.xyz/city,但代码里定义的接口路径是/api/city,存在路径不匹配的问题:
- 检查共享主机的伪静态/重写规则,确认
/api/*开头的请求会正确指向Laravel入口文件,不会被规则拦截去掉/api前缀,导致请求没有进入带Sanctum鉴权的API路由组,反而命中web路由组的受保护接口,触发401。 - 应用初始化阶段,在所有业务API请求发送前,先发起一次
/sanctum/csrf-cookie的请求,提前在浏览器写入鉴权需要的Cookie。本地开发时浏览器已经存储过对应Cookie,不会暴露这个问题,切换到线上域名后没有历史Cookie,不提前完成这一步就会直接鉴权失败。 - 如果站点没有配置HTTPS,需要关闭session配置里的
secureCookie选项,否则浏览器会直接拒绝存储鉴权Cookie,请求不会携带任何有效凭证。
内容的提问来源于stack exchange,提问作者ORHAN ERDAY
相关产品推荐
相关产品推荐

