Написание Flash crossdomain.xml для Amazon S3
У меня есть два сервера. Сервер А - это внутренний сервер, доступ к которому есть из внешнего мира, установленного здесь, в моем офисе. На нем запущен сервер 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>
Это файл crossdomain.xml сервера B:
<?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");
Независимо от того, что я делаю, однако, это просто не работает. Я не уверен, что еще попробовать. Я попытался просмотреть несколько решений здесь, но ничего не помогло мне решить мою проблему. Конечно, у кого-то еще было больше опыта в этом, чем у меня, и он может дать мне некоторое руководство, у меня довольно много идей на данный момент.
Обновление Обновление моего вопроса с дополнительной информацией.
Я попытался установить оба файла политики на *, и он начал работать, пока не нажал:
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 ответа
Похоже, у вас есть a.swf и b.swf на разных доменах, и a.swf пытается получить доступ к содержимому b.swf (через Loader.content
), и, без сомнения, это приводит к ошибке безопасности.
У вас есть два варианта:
Загрузите b.swf в тот же домен безопасности, что и a.swf (т. Е. "Текущий" домен безопасности). Вы можете сделать это в коде.swf, передав новый
LoaderContext
вLoader.load()
и настройкаloaderContext.securityDomain = SecurityDomain.currentDomain
Простота позволяет a.swf получить доступ к b.swf, вызвав
Security.allowDomain()
в коде b.swf с именем домена a.swf в качестве параметра
Какой из них вы выберете, зависит от других соображений. С первым b.swf может делать то, что может делать a.swf (все!) С точки зрения междоменной безопасности (например, доступ к файлам и т. Д.); со вторым любой SWF-файл в домене a.swf может получить доступ к содержимому b.swf. Это действительно зависит от того, как вы хотите установить доверие.
Убедитесь, что mime-тип файла crossdomain.xml имеет значение application/xml
, Flash не будет загружать файл политики, если тип mime установлен неправильно. Оформить заказ на бесплатный клиент s3 CloudBerry, он довольно хорош при обнаружении / установке правильного mimetype, возможно, используемый вами клиент s3 неправильно его установил.
Редактировать: Apache и другие веб-серверы обнаруживают тип MIME файла и возвращают его в заголовках ответов - поэтому эта проблема обычно не возникает при локальном тестировании
Решено, наконец. Убедитесь, что вы используете имя сегмента в качестве субдомена как для загрузки файла политики, так и для каждого запроса файла / URL.
Решение: