5

現在、Rails アプリと faye-server アプリの両方を Heroku でホストしています。faye サーバーはここ ( https://github.com/ntenisOT/Faye-Heroku-Cedar ) から複製され、正しく実行されているようです。Heroku ではサポートされていないため、websocket を無効にしました。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) それらの 2 つが互いに正常に通信しています!

本当にありがとう。

4

2 に答える 2

1

過去 1 時間以内に、heroku でホストされている faye と rails アプリの通信を取得しました...ここに私の観察があります。

  1. 環境変数を使用している場合は、すべてのサーバーで FAYE_TOKEN が設定されていることを確認してください。

  2. あなたがすでに行っているwebsocketsを無効にします...私にはうまくいきませんでした。代わりclient.disable(...)に使用しました。Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }

  3. これはあなたに当てはまるかもしれないし、当てはまらないかもしれませんが、私にとって追跡するのが最も難しいことでした. . しかし、これにより本番環境での通信に失敗したようです。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: *テストのために、それが役立つかどうかを確認することもできます

カスタム ヘッダー

一部のサービスでは、Bayeux サーバーに接続するために追加の HTTP ヘッダーを使用する必要があります。これらのヘッダーは 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 に答える