Не удается загрузить приложение Flash crossdomain.xml с сервера приложений?

Обзор

Я пишу веб-приложение с использованием трехуровневой архитектуры. У меня три сервера Amazon EC2 ubuntu. Первый сервер обрабатывает представление приложения и включает в себя мой основной флэш-файл. Второй экземпляр EC2 представляет мой сервер приложений. Он содержит файлы AMFPHP и соответствующие веб-службы. Наконец, третий экземпляр обрабатывает постоянство и запускает базу данных MySQL. Серверы презентации и приложений работают под управлением веб-сервера apache. Я создал группы безопасности, специфичные для каждого уровня, так что уровень представления будет принимать весь входящий трафик на порт 80, в то время как уровень приложения будет принимать только входящий трафик от сервера представления. Это должно позволить кому-либо запрашивать мое веб-приложение с сервера презентаций, но запретить кому-либо доступ к веб-службам на моем сервере приложений.

Проблема

Мое флеш-приложение не может выполнять вызовы веб-службы на мой сервер приложений. Когда запрос отправляется, я никогда не получаю ответа от сервера и в конечном итоге получаю ошибку изолированной программной среды безопасности.

Пример:

Security.loadPolicyFile( "http://<EC2 internal IP or public DNS>/crossdomain.xml" );
gw = new NetConnection();
gw.objectEncoding = ObjectEncoding.AMF0;

// connect to the AMFPHP gateway so we can use the services
gw.connect( "http://<EC2 internal IP or public DNS>/gateway.php" );
res = new Responder( onResult, onFault );
gw.call( "Service.test", res );

Расследование

То, что я не получал ответа, казалось странным, поэтому я решил попробовать несколько вещей: 1. Я подключился к своему уровню презентации через ssh и попытался использовать lynx для подключения к gateway.php моего сервера приложений. Мне удалось подключиться без проблем. 2. Я использовал окно инструментов разработчика Chrome для наблюдения за сетевым трафиком при загрузке моего сайта. Я обнаружил, что он пытается загрузить файл crossdomain.xml (который находится в корне моего веб-сервера [/ var / www] на уровне приложения) с помощью запроса GET; но, как ни странно, оно выходит из строя. Вот где я запутался. Почему я могу использовать lynx на том же компьютере для подключения к веб-серверу на уровне приложения, но при этом приложение flash не может получить доступ к тому же файлу?

Другая полезная информация

Выполняя несколько тестов, я решил открыть брандмауэр экземпляра сервера приложений, чтобы он мог получать HTTP-запросы с моего IP-адреса. Как только я это сделал, приложение, размещенное на уровне представления, сразу же начало работать (получен ответ от веб-службы)! Однако это означает, что мне придется заставить уровень моего приложения принимать HTTP-запросы из Интернета, чтобы работать, а я не хочу этого делать. Я не понимаю, почему внесение этого изменения позволило бы приложению получить файл crossdomain.xml. Если группа безопасности сервера приложений настроена на прием входящих HTTP-запросов от группы безопасности презентации, у нее не должно возникнуть проблем с получением файла crossdomain.xml, находящегося в корне веб-сервера сервера приложений, верно?

Я потратил больше времени, чем хотелось бы, на изучение этой проблемы. Я действительно хотел бы настроить трехуровневую среду для своего приложения, в которой флэш-приложение сможет отправлять запросы веб-служб на мой уровень приложения. Самая запутанная часть этого заключается в том, что когда я добавляю IP-адрес своего компьютера к брандмауэру сервера приложений, все, кажется, волшебным образом работает так, как задумано. Пожалуйста, поправьте меня, если я неправильно настраиваю приложение. Я основываю свою архитектуру на следующем: http://media.amazonwebservices.com/AWS_Web_Hosting_Best_Practices.pdf

Спасибо за вашу помощь!

С уважением,

Воля


person Will Johnson    schedule 02.08.2011    source источник
comment
Быстрое обновление. Я запустил tail -f в журнале доступа apache (tail -f /var/log/apache2/access.log) и заметил, что, хотя флэш-файл размещен на сервере презентаций, он отмечает GET-запрос как исходящий с моего компьютера. IP, а НЕ сервер представления. Это объясняет, почему приложение работает, когда я включаю входящие HTTP-запросы на брандмауэре сервера приложений.   -  person Will Johnson    schedule 03.08.2011
comment
Мне, должно быть, здесь не хватает чего-то фундаментального ... У меня создалось впечатление, что, поскольку мой флеш-файл размещается на сервере презентаций, запрос, сделанный из флеш-приложения, будет поступать с сервера презентации. Однако журнал доступа к apache2 говорит мне о другом. Запрос на получение помечен как исходящий с IP-адреса моего кабельного модема. Вот пример, в котором я использовал curl для доступа к файлу crossdomain.xml вместо запуска моего флеш-приложения на сервере презентаций:   -  person Will Johnson    schedule 03.08.2011
comment
10.194.229.65 - - [02 / Aug / 2011: 22: 25: 24 +0000] GET /crossdomain.xml HTTP / 1.1 200 518 - curl / 7.21.6 (i686-pc-linux- gnu) libcurl / 7.21.6 OpenSSL / 1.0.0d zlib / 1.2.3.4 libidn / 1.22 librtmp / 2.3 72.189.161.71 - - [02 / августа / 2011: 22: 27: 32 +0000] GET /crossdomain.xml HTTP / 1.1 200 575 dev.madmad.co/amfphptest.swf Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit / 534.30 (KHTML, например, Gecko) Chrome / 12.0.742.122 Safari / 534.30   -  person Will Johnson    schedule 03.08.2011


Ответы (1)


Если все ваши серверы находятся в разных доменах, вам необходимо загрузить crossdomain.xml с сервера, с которого вы запрашиваете данные / файлы.



Итак, если ваш swf находится на сервере A и вам нужны данные с сервера b, вам необходимо загрузить файл политики на сервер b.

// there is no need to reference the crossdomain.xml.
Security.loadPolicyFile( "http://serverBdomainname.com" )

// or for testing purposes you can use local address but this will not work over the web
// just code in the IP of the server if your machine is on the same network
Security.loadPolicyFile( "192.168.0.111" )

Также вы можете убедиться, что ваш crossdomain.xml доступен в Интернете, открыв его в браузере.
http://serverBdomainname.com/crossdomain.xml

person The_asMan    schedule 03.08.2011