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

如何将基于mercure.rocks的Symfony聊天应用迁移至Caddy Server配置并解决CORS跨域问题

看起来你遇到的核心问题是CORS策略阻止了跨域请求,同时还存在JWT密钥不匹配的潜在问题,这两个点结合导致聊天应用无法正常连接到Mercure Hub。下面是一步步的修复方案:

1. 修复Caddy配置中的关键问题

你的Caddy Mercure配置里有两处需要调整的核心项:

  • JWT密钥必须和Symfony保持一致:Caddy中的jwt_key、publisher_jwt、subscriber_jwt要和Symfony .env里的MERCURE_JWT_KEY完全匹配,否则会导致认证失败,甚至间接影响CORS头的正常返回。
  • 明确开启匿名访问并确认CORS来源:既然你在Symfony中允许匿名订阅,需要在Caddy配置中显式声明,同时确保CORS来源覆盖你的前端域名。

修正后的Caddy配置片段:

mercure {
    # 必须与Symfony的MERCURE_JWT_KEY完全一致
    jwt_key notherealkey
    publisher_jwt notherealkey
    subscriber_jwt notherealkey
    # 允许前端域名跨域请求
    cors_origins https://stage.tamilchatz.com
    # 保持旧配置的发布权限(允许所有来源发布)
    publish_origins *
    # 允许匿名订阅(匹配Symfony的配置)
    allow_anonymous
    {$MERCURE_EXTRA_DIRECTIVES}
}

2. 精简并修正Symfony .env配置

你的Symfony配置里存在重复和不必要的项,精简后确保关键配置和Caddy对齐:

# 指向Caddy托管的Mercure端点
MERCURE_PUBLISH_URL=https://caddy.tamilchatz.com/mercure
# 和Caddy一致的JWT密钥
MERCURE_JWT_KEY=notherealkey
# 允许匿名访问
MERCURE_ALLOW_ANONYMOUS=1
# 订阅端点(Caddy的Mercure默认使用该路径)
MERCURE_SUBSCRIPTIONS_URI=https://caddy.tamilchatz.com/mercure
# CORS允许的来源(和Caddy配置完全匹配)
MERCURE_CORS_ALLOWED_ORIGINS=https://stage.tamilchatz.com
# 允许所有来源发布(保持旧配置逻辑)
MERCURE_PUBLISH_ALLOWED_ORIGINS=*

3. 应用配置并验证

完成上述修改后,执行以下步骤确保配置生效:

  • 重启Caddy服务:sudo systemctl restart caddy
  • 清除Symfony缓存,避免旧配置残留:php bin/console cache:clear --env=prod(开发环境可去掉--env=prod)
  • 重新访问https://stage.tamilchatz.com/chat,打开浏览器控制台检查是否还有CORS错误。

额外排查点

如果问题仍未解决,可以做以下检查:

  • 查看Caddy日志,排查Mercure相关错误:sudo journalctl -u caddy -f
  • 验证Mercure Hub是否正常运行:直接访问https://caddy.tamilchatz.com/.well-known/mercure/ui/,确认调试界面能正常打开
  • 确认SSL证书有效性:Caddy通常会自动申请Let's Encrypt证书,可通过浏览器地址栏的锁图标验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:32:37