Pull to refresh

Flash +.РФ. Что делать?

Reading time 3 min
Views 3.8K
Собственно, проблема.
Флэш-ролик не может обратиться к ресурсам на сервере, если размещен на сайте с международным именем (в частности, РФ). Замечено в браузере Firefox под Windows.
Не очень приятный глюк, особенно с учетом распространенности данного браузера и данной платформы… Беглый взгляд по форумам не принес желаемых результатов, и пришлось взяться за исследования. Итак, подробности…

Тесты


Для начала — тестовая флэшка. Кода из нескольких строчек достаточно для нашего исследования:

var xml = new XML;
xml.onLoad = function() {
  _root.txt.text = this.toString();
};
xml.load(typeof(_root.link) === "undefined" ? "test.xml" : _root.link);

Ну и, естественно, нужно не забыть текстовое поле с именем txt на первом кадре. Алгоритм простой: загружаем файл «test.xml» и отображаем его содержимое. Если указан параметр «link», то XML загружается из указанного адреса. Соответствующий «test.xml» сделаем самым простым:

<?xml version="1.0" encoding="UTF-8"?>
<test>Test</test>

Файлы «test.swf» и «test.xml» выкладываем на сервер и начинаем тесты. Для тестов использовались два домена, один RU и один РФ, являющиеся синонимами. Ожидаемый результат — флэшка должна отображать содержимое XML-файла на любом домене. С тестом справились:
  • Opera 11 (Windows, Linux)
  • Google Chrome 9 (Windows, Linux)
  • Internet Explorer 8
  • Internet Explorer 6 (адрес punycode)
Из распространенных браузеров тест провалился только в Firefox (Windows, Linux). Браузеры Lynx и W3M не участвовали, по понятным причинам.

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


Что же не так? Попробуем протестировать загрузку ресурсов с сервера через Firebug.

С доменом RU все хорошо:


А вот с доменом РФ что-то не так:


Собственно, видна проблема: Flash-плагин в сочетании с Firefox делают запрос на адрес, не закодировав доменное имя в punycode, что и вызывает проблему.

Окей, попробуем по-другому. Сделаем так, чтобы данные загружались с домена RU. Добавим в адрес параметр «link», который мы предусмотрели специально для этого случая.
Понятно, что у нас ничего не получится из-за проблем с кроссдоменными запросами. Но раз уж решили действовать последовательно — будем последовательными
Что и требовалось доказать:


Вооружившись документацией, создадим файл «crossdomain.xml» в корне сайта. Этот файл будет запрошен с домена RU (с того домена, где размещен XML-файл), и в нем должно быть указано какие флэш-ролики могут загружать загружать данные (точнее, на каких доменах опубликованы эти ролики).

Вот только вопрос: какому домену разрешить запросы к нашему XML-файлу? Ведь, как мы увидели, с кириллическим именем домена есть определенные проблемы…

Мы последовательно протестировали все возможные имена домена РФ:
  • Кириллица (.рф)
  • Punycode (.xn--p1ai)
  • URL-кодирование, нижний регистр (.%d1%80%d1%84)
  • URL-кодирование, верхний регистр (.%D1%80%D1%84)
И… Все безуспешно. Все вариации на тему «crossdomain.xml» такого вида не приносили результатов:
<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="сайтнн.рф"/>
<allow-access-from domain="*.сайтнн.рф"/>
<allow-access-from domain="xn--80asmaqi.xn--p1ai"/>
<allow-access-from domain="*.xn--80asmaqi.xn--p1ai"/>
<allow-access-from domain="%D1%81%D0%B0%D0%B9%D1%82%D0%BD%D0%BD.%D1%80%D1%84"/>
<allow-access-from domain="*.%D1%81%D0%B0%D0%B9%D1%82%D0%BD%D0%BD.%D1%80%D1%84"/>
<allow-access-from domain="%d1%81%d0%b0%d0%b9%d1%82%d0%bd%d0%bd.%d1%80%d1%84"/>
<allow-access-from domain="*.%d1%81%d0%b0%d0%b9%d1%82%d0%bd%d0%bd.%d1%80%d1%84"/>
</cross-domain-policy>

Выглядело это так:


То есть, «crossdomain.xml» загружается, но флэш-плеер решает, что XML-данные с этого сайта загружать нельзя.

Решение


Остался последний вариант — указать в качестве домена "*". Таким образом, «crossdomain.xml» приобрел следующий вид:
<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

И — о чудо!


Мораль


Решение проблемы существует. Без издевательства. Решение, конечно, не идеальное, потому что доступ к данным через «crossdomain.xml» открывается сразу для всех сайтов. Впрочем, это не всегда проблема, потому что кому надо — те смогут обратиться к данным и другим способом, не обращая внимания на «crossdomain.xml».

Относительно того, указывать ли имя хоста в параметрах (flashvars), или же его нужно включить в исходник флэш-ролика, вопрос остается открытым. Наверняка многие разработчики в целях защиты предпочитают «хардкодить» имена сайтов во флэшки, и наверняка многие предпочитают выносить эти адреса в параметры. Вполне допускаю правоту и тех, и других, в зависимости от проекта и задач. И предпочитаю на эту тему не спорить.

Материалы:
Tags:
Hubs:
+32
Comments 75
Comments Comments 75

Articles