クロスドメインポリシーファイルについてまとめました。
Flash Player 10からの情報も追記しましたが、ちょっと自信が無いので間違っていたらすみません。

youtubeのクロスドメインファイル
○クロスドメインポリシーファイルとは
Flashから別ドメインにある外部ファイルを読む場合に必要になる、設定を記述したファイルです。設置場所は読み込みたい外部ファイルが置いてあるサーバになります。ファイル名は基本的に「crossdomain.xml」とします。
ファイルには以下のように記述します。
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="hogehoge" /> </cross-domain-policy>
○接続元ドメインの許可
不特定多数のサーバからのリクエストを許可する場合は[domain="*"]とします。
ある決められたサーバからのみを許可する場合は[domain="許可するドメイン"]とします。
ex)hoge.comから許可したい場合は[domain="http://hogehoge.com"]。
ex)同一ドメインのサブドメインからのリクエストを許可する場合は[domain="*.hogehoge.com"]。
ex)複数個のドメインを許可する場合は
<cross-domain-policy> <allow-access-from domain="*.hogehoge.com" /> <allow-access-from domain="www.fugafuga.com" /> <allow-access-from domain="127.0.0.1" /> </cross-domain-policy>
と記述。
○ポートの制限
また、ポートの制限をかけることができます。
XMLSocketクラスを使用してソケット通信を行う場合などに有効です。
<allow-access-from domain="*.hogehoge.com" to-ports="1024" />
○ファイルの設置場所
基本的にドメインの直下(ルートディレクトリ)に設置します。
swfは自動的にルートディレクトリにあるcrossdomain.xmlを読みにいきます。
もし、あるディレクトリに限って制限を設けたい場合は、該当するディレクトリに
crossdomain.xmlを設置し、swfに明示的にcrossdomain.xmlへのパスを指定します。
System.security.loadPolicyFile(‘http://hogehoge.com/sample/crossdomain.xml’);
○HTTPS(セキュア領域)のファイルを読む場合
同一ドメインでもSSL領域のファイルを読む場合はcrossdomain.xmlの設置が必要です。
secure=”false”を追記します。
<allow-access-from domain="http://hogehoge.com" secure="false" />
—crossdomainとは関係ないのですが、ハマったのでメモ—
○IEだとSSL領域のファイルが読めなくなる可能性がある件
IEを使用し、FlashからSSL領域にあるファイルを読み込もうとすると、ロードが始まらない現象が報告されてます。
Flash-JP
Internet Explorer が SSL 経由によるファイルのダウンロードで “No-Cache” ヘッダーを処理できない
こちらにあるとおり、サーバからはきだされるヘッダーがNo-Cacheになっていると正しく処理が出来ないようです。No-Cache意外にすると問題なくロードされます。
————
2009.1.19追記
○Flash Player10からセキュリティポリシーが変更に
FlashPlayer10からクロスドメインの設定ルールに少し変更が加わりました。(すっかり忘れていて通信部分でちょっとはまった)いまさらですが備忘録もかねまとめます。認識間違ってたらすみません。
○メタポリシーファイルとcrossdomain.xmlの設置
メタポリシーファイルとはポリシーファイル(crossdomain.xml)の設定や管理を行うファイルとでも言えばいいのかな。セキュリティポリシーの変更により、FlashPlayer10からメタポリシーファイルの設置が必要になりました。必要なケースは、
・crossdomain.xmlがサーバのルート(ドメイン直下)に設置されていない場合
が挙げられます。その場合、ルート直下に以下のようなcrossdomain.xml(マスターポリシーファイル)を設置します。
<?xml version="1.0"?> <cross-domain-policy> <site-control permitted-cross-domain-policies="all" /> </cross-domain-policy>
site-control要素のpermitted-cross-domain-policies属性を操作することで、ルート以外にあるポリシーファイルの動作を管理できます。なお、ルートにcrossdomain.xmlが配置してある場合は別途設置する必要はなく、以下のように記述を追加します。
<?xml version="1.0"?> <cross-domain-policy> <site-control permitted-cross-domain-policies="all" /> <allow-access-from domain="*.hogehoge.com" /> <allow-access-from domain="www.fugafuga.com" /> <allow-access-from domain="127.0.0.1" /> </cross-domain-policy>
○ドメイン直下に置けない場合
サーバの事情により、直下にメタポリシーファイル(マスターポリシーファイル)を設置できない場合も考えられます(これでかなり困った)。対処方法としては「サーバ管理会社を説得する」というなんともアレな方法が挙げられますが、それでもどうしようもない場合はphpなどを利用し、HTTPレスポンスヘッダに
<?php
header("HTTP/1.1 200 OK");
header("X-Permitted-Cross-Domain-Policies: all");
header("content-type:text/xml;charset=UTF-8");
print '<?xml version="1.0"?>'."\n";
print '<cross-domain-policy>'."\n";
print '<allow-access-from domain="*" />'."\n";
print '</cross-domain-policy>'."\n";
exit;
?>
と追記することで動作可能になります。本来ならApacheの設定とか変えたほうが良いんでしょうが・・・。
ここ間違ってるよ!という箇所があればご指摘くださいませ。


はじめまして。
理由は別であれ、私もこのページの執筆者と同じく、domain直下にcrossdomain.xmlを置けなくて困っておりました。
(自分の環境では執筆無料サーバーをお借りしてるためサーバー管理者にドメイン直下にcrossdomain.xml置いてくれなんて言えなかったのですが…。)
ところがphpを使えばなんとかなりそうだということがわかりほっとしました。
cgiスクリプトはperlで記述していたので、phpを勉強しなければなりませんが、参考にしてやってみようと思います。
もしperlでの打開法もわかったらここに書き込ませていただきたいと思います
はじめまして。
フラッシュ始めたばかりの超初心者です。
クロスドメインがffftpでアップできないとでてしまって
困って3時間くらい彷徨ってたら、こちらに出会いました。
メタポリシーファイルの書き換えは、なんとかわかったのですが、
phpの利用、こちらについてご指導いただけないでしょうか?
httpレスポンスのヘッダに・・これは、bin-releaseのどこにあるのでしょうか?
あまりにド素人な質問でゴメンナサイ。
やっと100時間以上かけて初めて作ったhpなので、なんとかアップしたくて・・。
よろしくお願いします。m(_ _”m)ペコリ