这是场景。我在一个网站上使用 ActionCable(我们称之为 www.example.com
)。它在开发中工作得很好,但是一旦我将其推送到 Heroku,我就会收到 WebSocket 连接的 302 错误。
问题似乎源于我的 Heroku 使用自定义域这一事实。因此,如果我将 WebSocket 指向 wss://example.com
,它会给我一个 302,我假设是因为它被重定向到 example.herokuapp.com
网址?
因此,鉴于此问题,我被迫将 WebSocket 连接指向 wss://example.herokuapp.com
。我现在遇到的问题是,因为它本质上是我指向的新域,所以来自 example.com 的 cookie 不会与 example.herokuapp.com
共享。这意味着 example.herokuapp.com
正在传递一个空白 cookie,该 cookie 实际上是在我用于身份验证的 example.com 上设置的。
我通过记录未签名的 cookie(只是为了测试而暂时未签名,不要担心安全性)并在 example.herokuapp.com
服务器上设置该 cookie 来验证这是问题所在。之后它工作得很好。
显然我不能让某人去这两个网站只是为了设置一个该死的 cookie...
我希望找到一种方法来解决最初的问题,并能够将 WebSocket 指向我的自定义域 wss://example.com
而不必担心 cookie签名问题。这可能吗?
如果没有,在 example.herokuapp.com
域上设置 Cookie 的最佳方式是什么?
附注是的,我看过有关 ActionCable 和 Heroku 的其他问题,但似乎没有一个涉及自定义域。这个讨论了 cookie 解决方法,但我觉得它不适用于这种情况,因为它们不是相同的子域:Deploying Ruby on Rails app to Heroku while using Action Cable (Puma port listening)
感谢你们花时间帮助我:)
[编辑] 这似乎与这里的问题非常相似,但我得到的是 302 而不是 503。 Heroku error 503, webSockets on multiple domains
最佳答案
因此,问题似乎源于这样一个事实:WebSocket 请求没有被视为 WebSocket 请求,而是正常的、未升级的请求。这就是被设计重定向的。
我发现没有任何 HTTP_UPGRADE header 的原因是 CloudFlare。他们没有在非企业帐户(5000 美元以上)上启用 WebSocket。我在其他 SlackOverflow 问题上读到,您可以要求 CloudFlare 在您的帐户上启用它,但在他们开始为所有帐户类型启用它们之前很可能不会发生。
在 CloudFlare 打开 WS 之前,唯一的其他选择似乎是找到一种在自定义域和 Heroku 域之间共享/设置 cookie 的方法。我还没有找到解决方案,等待 Heroku 来帮助我。如果我能为 CloudFlare + 自定义域 Heroku + Action Cable 用户提供解决方案,我会为 future 可能的 Google 员工更新此答案。
关于ruby-on-rails - ActionCable、Heroku 自定义域和 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782332/