2012-03-02 6 views
1

私は2つのサーバーを持っています。サーバーAは、私のオフィスでここに設定された外部からアクセスできる内部サーバーです。それにはRailsサーバーが実行されています。私は静的コンテンツ(画像、swf、javascript、cssなど)をすべて含んでいる第2のサーバー、Server Bを持っています。これはAmazon S3サーバーです。私はこれらすべてのファイルにパブリックアクセスを与えました。Amazon S3のFlash crossdomain.xmlを書く

私が試みているのは、サーバーAによって提供されるページにサーバーBのswfを置くことです。次に、表示するためにswfが必要とするその他のアセットは、サーバーBから動的にロードされます。しかし、残念ながら、それが失敗し、動的にロードされるように要求されたファイルは決して到着しません。

私のブラウザコンソールのエラーに基づいて、swfはcrossdomain.xmlファイルがサーバーAにあることを期待しています。thisに基づいて、私のS3サーバー上にあるものも必要です。ですから、私は2つのcrossdomain.xmlファイルを作成しました。各ファイルは各サーバーに1つずつあります。

これは、サーバーAのcrossdomain.xmlファイルです:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE cross-domain-policy SYSTEM 
    "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <site-control permitted-cross-domain-policies="master-only"/> 
    <allow-access-from domain="*.server-a.com"/> 
    <allow-http-request-headers-from domain="*.server-a.com" headers="SOAPAction"/> 
</cross-domain-policy> 

はまた、私は明示的に私のサーバーBのcrossdomain.xmlファイルをロードしています:これは、サーバーBのcrossdomain.xmlファイルである

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE cross-domain-policy SYSTEM 
    "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-access-from domain="s3-bucket-name.s3.amazonaws.com" /> 
</cross-domain-policy> 

swf:

Security.loadPolicyFile("https://s3-bucket-name.s3.amazonaws.com/crossdomain.xml"); 

ただし、私は何をしても機能しません。私は他に何をしようとしているのか分からない。私はここでいくつかの解決策を探してみましたが、私の問題をまだ解決できていません。確かに他の誰かがこれ以上の経験を私が持っていて、私にいくつかの指導を与えることができます。私はこの時点でかなりのアイデアを出しています。

更新 私の質問をいくつかの情報で更新します。

私は*に、両方のポリシーファイルを設定しようと、それがヒットするまで、それが仕事を始めた:

SecurityError: Error #2121: Security sandbox violation: Loader.content: s3.amazonaws.com/bucket_name/swfs/foo.swf cannot access s3.amazonaws.com/bucket_name/data/swfs/bar.swf. This may be worked around by calling Security.allowDomain. 

はまた、私はチャールズを走ったし、それは私のローカルサーバの両方からのcrossdomain.xmlを引いているが、私はしないでくださいs3のためにそれを見てください。

アップデート2 私はローダにこれを追加してみました:

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
Loader.load(new URLRequest(_dataFile), context); 

これは、実際にダウンロードしたファイルになりました!残念ながら、今ではこれでアウトクラッシュ:私はcontext.applicationDomain = ApplicationDomain.currentDomain;行が含まれていないが、それでも問題が解決していない/含む試してみた

SecurityError: Error #2119: Security sandbox violation: caller s3.amazonaws.com/bucket_name/swfs/MainSwf.swf cannot access LoaderInfo.applicationDomain owned by s3.amazonaws.com/bucket_name/data/swfs/foo/SecondSwf.swf 

loader_.contentLoaderInfo.applicationDomain.getDefinition(def.a)

+0

あなたはURLLoaderクラスを使用して、またはしていますか? (2)両方のファイルをdomain = "*"に変更し、何が起こるかを見てください。 (3)Charlesなどのローカルプロキシサーバーを実行し、ファイルが要求されているかどうかを確認します。 – Manish

+0

1.ローダー; 2.これを試したところ、次のようになるまでロードが開始されました:SecurityError:Error#2121:セキュリティサンドボックス違反:Loader.content:http://s3.amazonaws.com/bucket_name/swfs/foo.swf httpsにアクセスできない: //s3.amazonaws.com/bucket_name/data/swfs/bar.swf。これは、Security.allowDomainを呼び出すことで回避できます。 – keybored

+0

さらにチャールズを走らせて、両方のローカルサーバーからcrossdomain.xmlを取得していますが、s3では表示されません。 – keybored

答えて

0

あなたが持っているように見えますa.swfとb.swfは異なるドメインにあり、a.swfはb.swfのコンテンツに(Loader.contentを介して)アクセスしようとしていますが、セキュリティエラーで失敗していることは間違いありません。 a.swfと同じセキュリティドメイン(すなわち、 "現在" のセキュリティドメイン)で

  1. ロードb.swf:

    は、2つのオプションがあります。あなたはLoader.load()に新しいLoaderContextを渡すとloaderContext.securityDomain = SecurityDomain.currentDomain

  2. 明示的にはa.swfがa.swfのドメイン名などでb.swfのコードでSecurity.allowDomain()を呼び出すことによってb.swfにアクセスすることを可能に設定することにより、a.swfのコードでこれを行うことができますパラメータ

どちらを選択するかは、その他の考慮事項によって異なります。最初のものでは、b.swfはクロスドメインセキュリティ(すなわちアクセスファイルなど)の面でa.swfが何ができるのか(すべて!)を行うことができます。 2番目のファイルでは、a.swfのドメイン上のSWFファイルはb.swfのコンテンツにアクセスできます。それは本当にあなたが信頼を確立する方法に依存します。

+0

あなたの最初の提案として、私がそれをしたら、私が気づくべきであるセキュリティ上の考慮事項はありますか? – keybored

+0

私は先に進み、最初の提案を試みました。実際にファイルをロードしました!しかし、これでクラッシュします:SecurityError:エラー#2119:セキュリティサンドボックス違反:呼び出し元http://s3.amazonaws.com/bucket_name/swfs/MainSwf.swfは、https://s3.amazonawsが所有するLoaderInfo.applicationDomainにアクセスできません。 com/bucket_name/data/swfs/foo/SecondSwf.swf。 – keybored

+0

最初の提案で@キーボードされていますが、自分自身に質問するには:a.swfのドメインでb.swfをホストしますか? (つまり、b.swfが信頼できない第三者によって開発された場合は、あなたがしなかった方がベストです)。 – Manish

1

のcrossdomain.xmlのMIMEタイプがapplication/xmlに設定されていることを確認してください:クラッシュが実際に発生している

は、我々はのApplicationDomainを取得しているところファイルがロードされた後に後であります。 mimeタイプが正しく設定されていないと、Flashはポリシーファイルをロードしません。チェックアウトCloudBerry's無料のs3クライアント、それは正しいmimetypeを検出/設定するのが得意です。使用しているs3クライアントが正しく設定していない可能性があります。

編集:Apacheの、および他のWebサーバ、ファイルのMIMEタイプを検出し、レスポンスヘッダにそれを返す - ので、この問題は通常、ローカルテストで起動しません

+0

xmlファイル自体にこれが設定されていますか? – keybored

+0

いいえ。ファイルをs3にアップロードするときに設定します(コンテンツタイプヘッダーを手動で設定する必要があります)。 Apacheは自動的にファイルのMIMEタイプを検出し、それをContent-Typeヘッダに返します。 –

1

最後に解決されました。ポリシーファイルの読み込みとすべてのファイル/ URL要求の両方のバケット名をサブドメインとして使用していることを確認してください。

ソリューション:それはローダー

(1)

http://onegiantmedia.com/cross-domain-policy-issues-with-flash-loading-remote-data-from-amazon-s3-cloud-storage

+0

+1これが私たちの問題を解決しました。良いリンク。 crossdomain.xmlのリンク先にバケツの名前を最初に置くと固定されたものです。最終的に何かを解決するためのあいまいな方法です。このヒントは、よりよく文書化されるべきです。 – BillR