Написание Flash crossdomain.xml для Amazon S3 - PullRequest
1 голос
/ 02 марта 2012

У меня есть два сервера.Сервер A - это внутренний сервер, доступ к которому есть из внешнего мира, установленного здесь, в моем офисе.На нем запущен сервер Rails.У меня есть второй сервер, сервер B, который содержит весь наш статический контент (изображения, swfs, javascript, css и т. Д.), Это сервер Amazon S3.Я предоставил всем этим файлам открытый доступ.

Я пытаюсь поместить SWF-файл с сервера B на страницу, обслуживаемую сервером A. Затем другие ресурсы, которые требуются SWF для отображения, становятся динамически.загружается с сервера B. Однако, к сожалению, где-то по пути происходит сбой, и файлы, которые запрашиваются для динамической загрузки, просто не приходят.

На основании ошибок в консоли браузера SWF ожидает файл crossdomain.xml.файл должен быть на сервере А. На основании этого он также должен быть на моем сервере S3.Итак, в этом случае я создал два файла crossdomain.xml, по одному для каждого сервера.

Это файл crossdomain.xml сервера A:

<?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>

Это кросс-домен сервера B.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>

Кроме того, я явно загружаю файл crossdomain.xml сервера B в свой swf:

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

Независимо от того, что я делаю, он просто не работает,Я не уверен, что еще попробовать.Я попытался просмотреть ряд решений здесь, на SO, но ничто не помогло мне решить мою проблему.Конечно, у кого-то еще было больше опыта в этом, чем у меня, и он может дать мне некоторые рекомендации, на данный момент у меня почти нет идей.

Обновление Обновление моего вопроса с некоторыми другимиinfo.

Я попытался установить оба файла политики на *, и он начал работать, пока не нажал:

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);

Это привело к загрузке файлов!К сожалению, теперь он вылетает с этим:

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

Я пытался включить / не включить строку context.applicationDomain = ApplicationDomain.currentDomain;, но это не решило проблему.

Где происходит сбой на самом делепроисходит позже, после загрузки файла, где мы получаем домен приложения: loader_.contentLoaderInfo.applicationDomain.getDefinition( def.a )

Ответы [ 3 ]

1 голос
/ 02 мая 2012

Решено, наконец. Убедитесь, что вы используете имя сегмента в качестве субдомена как для загрузки файла политики, так и для каждого запроса файла / URL.

Решение:

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

1 голос
/ 02 марта 2012

Убедитесь, что mime-тип файла crossdomain.xml имеет значение application/xml. Flash не будет загружать файл политики, если тип mime установлен неправильно. Оформить заказ Бесплатный клиент s3 CloudBerry , он довольно хорошо обнаруживает / устанавливает правильный mimetype, возможно, используемый вами клиент s3 неправильно его установил.

Редактировать: Apache и другие веб-серверы обнаруживают тип MIME файла и возвращают его в заголовках ответа - поэтому эта проблема обычно не возникает при локальном тестировании

0 голосов
/ 03 марта 2012

Похоже, у вас есть a.swf и b.swf в разных доменах, и a.swf пытается получить доступ к содержимому b.swf (через Loader.content), и, без сомнения, происходит сбой из-за ошибки безопасности.

У вас есть два варианта:

  1. Загрузить b.swf в том же домене безопасности, что и a.swf (т. Е. «Текущий» домен безопасности).Вы можете сделать это в коде a.swf, передав новый LoaderContext в Loader.load() и установив loaderContext.securityDomain = SecurityDomain.currentDomain

  2. Explicity, позволяющий a.swf получить доступ к b.swf, вызвавSecurity.allowDomain() в коде b.swf с именем домена a.swf в качестве параметра

Выбор того, что вы выберете, зависит от других соображений.С первым b.swf может делать то, что может делать a.swf (все!) С точки зрения междоменной безопасности (например, доступ к файлам и т. Д.);со вторым любой SWF-файл в домене a.swf может получить доступ к содержимому b.swf.Это действительно зависит от того, как вы хотите установить доверие.

...