2012-03-02 5 views
1

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

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

Исходя из ошибок в моей консоли браузера, swf ожидает, что файл crossdomain.xml будет находиться на сервере A. На основе this ему также нужен тот, который будет на моем сервере 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 файл-сервер Б:

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

Update 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; линию, но это не решило проблему.

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

+0

(1) Вы используете URLLoader, или это Loader? (2) Измените оба файла на domain = "*" и посмотрите, что произойдет. (3) Запустите Charles или какой-нибудь другой локальный прокси-сервер и посмотрите, запрашиваются ли файлы (и обслуживаются). – Manish

+0

1. Погрузчик; 2. Я просто попробовал это, он начал загружаться, пока не сделал это: SecurityError: Ошибка # 2121: нарушение безопасности изолированной среды: Loader.content: http://s3.amazonaws.com/bucket_name/swfs/foo.swf не может получить доступ к https: //s3.amazonaws.com/bucket_name/data/swfs/bar.swf. Это можно обойти, вызвав Security.allowDomain. – keybored

+0

Кроме того, я запустил Чарльза, и он перетаскивает crossdomain.xml с моего локального сервера, но я не вижу его для s3. – keybored

ответ

0

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

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

  1. нагрузки b.swf в том же домене безопасности как a.swf (то есть "ток" домен безопасности). Вы можете сделать это в коде a.swf, передав новый LoaderContextLoader.load() к и установив loaderContext.securityDomain = SecurityDomain.currentDomain

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

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

+0

Что касается вашего первого предложения, есть ли какие-либо соображения безопасности, о которых я должен знать, если бы я это сделал? – keybored

+0

Я пошел вперед и попробовал первое предложение, оно фактически загрузило файлы! Но теперь это сбой: SecurityError: Ошибка # 2119: нарушение безопасности песочницы: вызывающий http://s3.amazonaws.com/bucket_name/swfs/MainSwf.swf не может получить доступ к LoaderInfo.applicationDomain, принадлежащему https: //s3.amazonaws. ком/bucket_name/данные/ФНБ/Foo/SecondSwf.swf. – keybored

+0

@keybored с первым предложением, вопрос, который задают себе: должен ли я разместить b.swf в домене a.swf? (т. е. если b.swf разрабатывается третьей стороной, которой вы не доверяете, тогда лучше всего этого не делать.) – Manish

1

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

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

+0

Установлено ли это в самом XML-файле? – keybored

+0

Нет, его набор, когда вы загружаете файл в s3 (вам нужно вручную установить заголовок содержимого). Apache автоматически определяет тип mime файла и возвращает его в заголовке Content-Type. –

1

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

Решение:

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

+0

+1 Это решило нашу проблему. Хорошая ссылка. Помещение имени ведра сначала в ссылку на crossdomain.xml исправленные вещи. Какой неясный способ окончательно решить что-то. Этот наконечник должен быть лучше документирован. – BillR

Смежные вопросы