crossdomain.xmlをルート以外の設置からでも認識させる方法
ActionScriptでクロスドメインを認識させる方法は、
1 |
|
↑たぶん、このようにスクリプトを書きます。
1 |
|
↑状況によってはドキュメントルート直下に「crossdomain.xml」置けないときもあると思います。
ボクは事情により後者で設定してFlashを再生させると、、
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害
(※これはFlash Debug Playerからのアラートです)
出た!出たよ!!出てしまったよ!!!(TOT)
そこでFlashTracerでログを追跡してどんなエラーが出ているかを調べてみました。
ここでクロスドメインの構造をサクッと説明しますが、ドキュメントルート以外のクロスドメインの方法は更に下のほうに書きます。
crossdomain.xmlの設置と記述方法
Flashのクロスドメイン問題はいにしえからある問題です。
そもそもクロスドメインというのは、swfファイルを貼り付けているHTMLをからみて、外部ファイルをロードするときに、そのファイルが置いてある場所は、HTMLファイルとは違うドメインという状態のことを指します。つまり、FlashPlayerは他人のドメインを攻撃してしまわないようにしているわけです。でも、世の中には写真共有サービスがあったりRSSコンテンツがあったりAPIなんかもあります。そういった場合は、どこからでも情報を取得してもいいですよ。といった感じに許可をすることができます。
その許可をするための設定ファイルが、 crossdomain.xml
にあたります。
たとえば、自分のサイト http://mysite.com
というサイトに表示させるFlashコンテンツが http://hoge.com
というサイトにあるRSSをロードするとします。
この場合、クロスしてますよね。 hoge.com
サイトは、 mysite.com
がRSSをロードしてもいいよ!と許可をする為に、 crossdomain.xml
をドキュメントルートの場所においてあげます。
アドレスは
http://hoge.com/crossdomain.xml
このようになります。実際に、この crossdomain.xml
の中に何が書かれているか、
1 |
|
4行目にある記述で http://mysite.com
と書いていると、 http://hoge.com
のRSSは http://mysite.com
からのみロードができる。という事になります。
例えば、 http://mysite.com
を含むサブドメインにも許可をする場合は、 *.mysite.com
と書きます。
1 |
|
全てのサイトからのアクセスを許可をする場合は、「*」だけを書きます。この設定はセキュリティに詳しい方に一回相談したほうがいいかもしれません。
1 |
|
ココからFlashのはなし
実際にFlashで設定するSecurityメソッドは、「crossdomain.xml」がドキュメントルートに設置されてて、かつ、その内容の設定で問題なければ、わざわざクロスドメインポリシーファイルをロードする必要はありません。
1 |
|
↑このようにドキュメントルートにある crossdomain.xml
をロードする記述はする必要がない。ということです。
んじゃ、どういったときにSecurityメソッドを使って crossdomain.xml
をロードするのかというと、ドキュメントルートとは違う階層にある crossdomain.xml
ファイルをロードするときに使います。例えば、ドキュメントルートであるhtdocsに、サブドメインごとにディレクトリを分けているとします。「content1」というディレクトリには外部からアクセスして欲しくないけど、「content2」というディレクトリにあるファイルは別のドメインからアクセス可能とするときに、「content2」にクロスドメインポリシーファイルを設置します。その時に、Flash側で書くスクリプトは、
1 |
|
↑と書いて、ポリシーファイルをロードさせると、Flashは「content2」以下にあるコンテンツを表示させることができます。
FlashPlayer10からの仕様変更
前述のように、ドキュメントルートとは違う場所の crossdomain.xml
を取得できてましたが、
FlashPlayerのバージョン10からクロスドメインの設定ルールに少し変更が加えられ、
かならずドキュメントルートの crossdomain.xml
を最初に参照する使用に変更されました。
もしドキュメントルートに crossdomain.xml
がない場合、
たとえ http://hoge.com/content2/crossdomain.xml
ここの場所に設定ファイルを置いていても
Error #2044: ハンドルされていない SecurityErrorEvent : text=Error #2048: セキュリティサンドボックス侵害
といったエラーが出てしまいます。
エラー : http://hoge.com/content2/rss.xml のリソースに対する、http://mysite.com/content.swf の要求者からの要求は、ポリシーファイルのアクセス権がないため拒否されました。
※FlashDebugPlayerのログ例
ドキュメントルートにメタポリシーファイルを設定する
crossdomain.xml
は、セキュリティポリシーを設定する記述のほかに、セキュリティポリシー設定ファイルを管理するメタポリシーとしても使うことができます。つまり、ポリシーファイルのポリシーファイルということですね。
これをドキュメントルートに設定すれば、FlashPlayer10以上でも、ドキュメントルート以外の crossdomain.xml
をロードすることができます。その中の記述に、site-controlタグを記述し、permitted-cross-domain-policiesをallにすると、全てのディレクトリーの crossdomain.xml
をロードすることを許可することを意味します。
1 |
|
1 |
|
ActionScriptには下記と書く。
1 |
|
クロスドメインでのエラーが出た場合の確認方法
一番単純なのは、外部画像やXMLなど、別ドメインから取得する場合、そのドメインのルートに crossdomain.xml
があるかどうか確認してください。
youtubeのクロスドメインは「http://www.youtube.com/crossdomain.xml」こうなります。ページが真っ白でしたらブラウザの「ソースを見る」で記述が確認できると思います。
Flashコンテンツを制作しているなかで、もし、クロスドメイン設定ファイルがなければサーバーの管理者に問い合わせて、設置してもらうようにお願いする必要があります。
詳しい crossdomain.xml
の説明に関してはAdobeのデベロッパーセンターページに詳しく載ってます。
http://www.adobe.com/jp/devnet/articles/crossdomain_policy_file_spec.html