Laravel Sail share(Expose)搭配Jetstream+Inertia+Sanctum登录异常问询
问题现象
在搭载 Jetstream + Inertia + Sanctum 的 Laravel 9.x 项目中执行 sail share 时存在以下异常:
- 可正常访问
XXXXXX.laravel-sail.site/login加载登录页 - 登录表单发起的POST请求可在Expose面板观测到,但要么始终挂起无响应,要么返回419 Page Expired错误,具体表现和配置调整有关
- 公共HTTPS地址
https://XXXXXXXXX.laravel-sail.site访问返回ERR_CONNECTION_REFUSED,仅公共HTTP地址http://XXXXXXXXX.laravel-sail.site:8080可正常加载页面
当前本地初始配置:APP_URL 为 http://localhost,Expose 生成的服务信息如下:
- 共享URL:
host.docker.internal:80 - 面板地址:
http://127.0.0.1:4040 - 公共HTTP地址:
http://XXXXXXXXX.laravel-sail.site:8080 - 公共HTTPS地址:
https://XXXXXXXXX.laravel-sail.site
已尝试的无效操作
- 在
.env中将SANCTUM_STATEFUL_DOMAINS和SESSION_DOMAIN设置为公共URL时触发419错误;设置为localhost时POST请求无响应;测试过SANCTUM_STATEFUL_DOMAINS带端口、不带端口两种配置均无效 - 将
SESSION_DRIVER从database改为cookie,仍返回419错误 - 在
config/cors.php中将'supports_credentials'设置为true - 在
Kernel.php中取消\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class的注释 - 在
TrustProxies.php中将$proxies设置为protected $proxies = '*';
遗漏配置与修复步骤
按以下顺序调整配置即可解决问题:
修正.env核心参数
将以下参数替换为对应值,严格遵守格式要求:APP_URL=http://XXXXXXXXX.laravel-sail.site:8080 SESSION_SECURE_COOKIE=false SANCTUM_STATEFUL_DOMAINS=XXXXXXXXX.laravel-sail.site:8080 SESSION_DOMAIN=XXXXXXXXX.laravel-sail.site配置说明:
SANCTUM_STATEFUL_DOMAINS必须带上8080访问端口SESSION_DOMAIN不要带协议前缀、不要带端口- 由于使用HTTP协议访问公共地址,必须关闭
SESSION_SECURE_COOKIE,否则浏览器不会在非HTTPS请求中携带会话cookie,直接触发CSRF校验失败。
补全受信代理头配置
仅配置$proxies = '*'不足以让Laravel正确识别Expose转发的请求信息,需要同时在app/Http/Middleware/TrustProxies.php中配置信任所有转发头,修改后代码如下:<?php namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware { protected $proxies = '*'; protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB; }缺少该配置时,Laravel无法正确识别转发请求的域名、端口、协议,生成的CSRF令牌作用域和实际请求域名不匹配,会持续返回419错误。
清除缓存重启服务
执行以下命令清除配置缓存,重启Sail服务后重新执行sail share即可正常登录:sail artisan config:clear sail artisan cache:clear sail restart
注:公共HTTPS地址返回连接拒绝是旧版Sail Share的已知问题,调试阶段直接使用8080端口的HTTP地址即可,不需要额外配置HTTPS相关参数。
内容的提问来源于stack exchange,提问作者Tim Gieseking
相关产品推荐
相关产品推荐

