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

跨域部署后SessionMiddleware因无效域无法设置Cookie问题排查

问题分析与解决方案

你的核心问题是SessionMiddleware的domain配置违反了浏览器Cookie的同源规则,导致Cookie被拒绝。

错误原因

后端部署在XXX-api.fly.dev,但你将SessionMiddleware的domain设为前端域名XXX-ui.fly.dev——根据浏览器Cookie规则,服务器只能将Cookie的domain设置为自身域名或其父域名,不能指定其他无关的子域名,否则浏览器会判定为无效域名并拒绝存储。

修正方案

方案1:使用父域名实现跨子域Cookie共享

如果希望前端(XXX-ui.fly.dev)和后端(XXX-api.fly.dev)共享会话Cookie,将domain设置为父域名.fly.dev(注意开头的点,代表所有fly.dev的子域):

app.add_middleware(
    SessionMiddleware,
    secret_key=SECRET_KEY,
    https_only=True,
    max_age=3600,
    same_site="none",
    domain=".fly.dev",
)

同时清理CORS配置中多余的端口项(部署后前端使用默认HTTPS端口443,无需指定3000):

origins = [
    "https://XXX-ui.fly.dev",
]

方案2:使用后端自身域名(不共享父域)

如果不需要跨子域共享Cookie,将domain设置为后端自身域名XXX-api.fly.dev,同时确保前端请求开启凭证携带:

app.add_middleware(
    SessionMiddleware,
    secret_key=SECRET_KEY,
    https_only=True,
    max_age=3600,
    same_site="none",
    domain="XXX-api.fly.dev",
)

前端请求配置示例:

  • Fetch:
    fetch('https://XXX-api.fly.dev/your-endpoint', {
      credentials: 'include'
    })
    
  • Axios:
    axios.get('https://XXX-api.fly.dev/your-endpoint', {
      withCredentials: true
    })
    

额外验证点

  1. 确保same_site="none"和https_only=True同时开启,这是跨域Cookie生效的必要条件(浏览器要求跨域Cookie必须是HTTPS且SameSite=None)。
  2. 确认CORS的allow_credentials=True已正确设置,且allow_origins未使用通配符*(你当前的配置符合要求)。

内容的提问来源于stack exchange,提问作者tprebenda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:22:03