5

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

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

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

    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)他们两个成功地相互通信!

非常感谢。

4

2 回答 2

1

在过去一个小时左右的时间里,我刚刚在 heroku 上托管了我的 faye 和 rails 应用程序……这是我的观察结果:

  1. 如果您使用环境变量,请确保您的所有服务器上都设置了 FAYE_TOKEN。

  2. 禁用您已经完成的 websockets...client.disable(...)对我不起作用,我使用Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }了。

  3. 这可能适用于您,也可能不适用于您,但对我来说是最难追踪的事情......在我的开发环境中,我的应用程序运行的端口将被添加到我的 faye 服务器的指定主机名的末尾...... . 但这似乎导致生产中的通信失败。我通过在 application_controller.rb 中创建一个 broadcast_server_uri 方法来解决这个问题,该方法在必要时处理包含一个端口,然后在我启动新频道的任何地方使用它。

……

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 中,包括

<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>

FWIW,我不会强调设置 Access-Control-Allow-Origin ,因为它似乎没有任何区别 - 我看到XMLHttpRequest cannot load http://...无论如何,但这应该仍然可以很好地让你畅通无阻。(虽然我很想学习更清洁的解决方案......)

于 2012-08-07T22:23:09.940 回答
0

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

对于测试,您还Access-Control-Allow-Origin: *可以查看是否有帮助

自定义标题

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

client.setHeader('Authorization', 'OAuth abcd-1234');

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

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

于 2012-08-07T17:39:33.737 回答