首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Faye on Heroku:跨域问题

Faye on Heroku:跨域问题
EN

Stack Overflow用户
提问于 2012-08-08 01:36:08
回答 2查看 2.6K关注 0票数 5

我目前在Heroku上托管我的rails应用程序和一个faye服务器应用程序。faye服务器已从此处克隆(https://github.com/ntenisOT/Faye-Heroku-Cedar),并且似乎运行正常。我禁用了websockets,因为Heroku不支持websockets。尽管在Faye的网站上声称:

Faye客户端和服务器透明地支持跨域通信,因此您的客户端可以连接到您喜欢的任何域上的服务器,而无需进一步配置。

当我尝试发布到一个faye频道时,我仍然遇到这个错误:

代码语言:javascript
复制
    XMLHttpRequest cannot load http://MYFAYESERVER.herokuapp.com. Origin http://MYAPPURL.herokuapp.com is not allowed by Access-Control-Allow-Origin.

我读过关于CORS的文章,并尝试实现这里概述的一些解决方案:http://www.tsheffler.com/blog/?p=428,但到目前为止还没有成功。我很想听一个人说:

1)有一个托管在Heroku上的rails应用程序2)有一个托管在Heroku上的faye服务器3)他们两个成功地相互通信了!

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-08 06:23:10

我刚刚把我的faye和rails应用托管在heroku上,在过去一个小时左右的时间里进行交流……以下是我的观察结果:

如果您正在使用环境variable.

  • Disable websockets,请确保在所有服务器上设置了您的
  1. ,您已经这样做了……client.disable(...)对我不起作用,我用的是Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }
  2. 这可能适用于你也可能不适用,但对我来说这是最难追踪的事情……在我的开发环境中,我的应用程序正在运行的端口将被附加到我的faye服务器的指定主机名的末尾...但这似乎导致了生产中的通信失败。我通过在application_controller.rb中创建一个broadcast_server_uri方法来解决这个问题,该方法在必要时处理端口的包含,然后在启动新通道的任何地方使用该方法。

……

代码语言:javascript
复制
class ApplicationController < ActionController::Base
  def broadcast_server
      if request.port.to_i != 80
        "http://my-faye-server.herokuapp.com:80/faye"
      else
        "http://my-faye-server.herokuapp.com/faye"
      end            
  end
  helper_method :broadcast_server

  def broadcast_message(channel, data)
    message = { :ext => {:auth_token => FAYE_TOKEN}, :channel => channel, :data => data}
    uri = URI.parse(broadcast_server)
    Net::HTTP.post_form(uri, :message => message.to_json)
  end


end

在我的应用程序javascript中,包括

代码语言:javascript
复制
<script>
  var broadcast_server = "<%= broadcast_server %>"
  var faye;
$(function() {
    faye = new Faye.Client(broadcast_server);
    faye.setHeader('Access-Control-Allow-Origin', '*');
    faye.connect();
    Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }

      // spin off your subscriptions here
  });
</script>

顺便说一句,我不会强调设置Access-Control-Allow-Origin,因为它似乎不会产生任何影响-我认为XMLHttpRequest cannot load http://...不管怎样,但它仍然可以很好地让你解锁。(尽管我很想了解更干净的解决方案...)

票数 1
EN

Stack Overflow用户

发布于 2012-08-08 01:39:34

我不能说我在Heroku上使用过Rails/Faye,但是您是否尝试过将Access-Control-Allow-Origin标头设置为类似Access-Control-Allow-Origin: your-domain.com的值

为了进行测试,您还可以使用Access-Control-Allow-Origin: *来查看是否有帮助

自定义标头

有些服务需要使用额外的HTTP标头来连接到它们的Bayeux服务器。可以使用setHeader()方法添加这些标头,如果底层传输支持用户定义的标头(当前仅支持长轮询),则会发送这些标头。

Client.setHeader(‘授权’,'OAuth abcd-1234');

来源:http://faye.jcoglan.com/browser.html

所以试试client.setHeader('Access-Control-Allow-Origin', '*');

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11851182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档