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

    Собственно, проблема.
    Флэш-ролик не может обратиться к ресурсам на сервере, если размещен на сайте с международным именем (в частности, РФ). Замечено в браузере 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), или же его нужно включить в исходник флэш-ролика, вопрос остается открытым. Наверняка многие разработчики в целях защиты предпочитают «хардкодить» имена сайтов во флэшки, и наверняка многие предпочитают выносить эти адреса в параметры. Вполне допускаю правоту и тех, и других, в зависимости от проекта и задач. И предпочитаю на эту тему не спорить.

    Материалы:
    Share post

    Similar posts

    Comments 75

      0
      Ну, кто первый закинет сообщение об этой проблеме в багзиллу Фонда Мозиллы?
        +2
        Мне кажется, его не пофиксят
          +2
          Возьмите и исправьте. Open-source ведь :) По-моему, можно справиться за недельку, если это критично для бизнеса.
        +22
        Чтобы не решать проблему просто не надо регистрировать этот никому не нужный прорекламированый домен
          +1
          Вы в багзилу посмотрите. Проблема с любым нелатинским доменом
            +14
            Любой не латинский домен это политическое решение, а не оптимальное.
              +15
              Нелатинские домены не нужны.
                0
                а что проще, неопытному юзеру набрать в адресной строке (причем чаще всего набирают адрес прямо в поиске), avtoservice или автосервис, имхо это распространённое мнение it'шников
              –6
              Ну а Медведеву со своим сайтом что делать, например?
                +13
                Ничего не делать. Использовать латинский и не страдать фигней, как ниже правильно написано.
              +24
              Самое очевидное решение, очевидное для любого вменяемого айтишника — не страдать фигнёй и не поддерживать маразм под названием «кириллические домены». Ещё можно подумать о целесообразности применения флеша, но это слишком холиварно.
                +2
                Я вас поддерживаю, но если уж домен зарегистрирован, нельзя игнорировать проблему. Кроме того мозг полезно немножко потренировать)
                  +3
                  Действительно, проблему нельзя игнорировать. Нужно признать свои ошибки, сделать выводы и перенести сайт на нормальный домен.
                    0
                    Мы не ищем легких путей) И некошерно для решения проблемы менять домен
                      –1
                      Если он не для пользователей, а для ваших игр создается, то да, некошерно.
                      • UFO just landed and posted this here
                        +2
                        Путь настоящего программиста.
                        Программа не работает с русским системным языком в Windows? Не беда: русский язык как основной — это для идиотов. Инструктируем юзера, как поставить английскую версию, и дело в шляпе :)
                          +1
                          И при чем здесь такая аналогия?

                          Вот верная аналогия: сделали на сайте ярко-красный фон. И белый шрифт плохо на нем читается. Создается топик «меняем шрифт на черный — станет лучше!». Мой комментарий был бы «издеваетесь? фон измените». А ваш был бы о том, что настоящие программисты изобретут специальные очки для удобного чтения на красном фоне, а не пойдут легким путем!
                            –5
                            Ваша аналогия не к месту. Кириллические URL прекрасно читаются в России. Гораздо лучше, чем латинские.
                              0
                              Смотря кем прекрасно читаются и уж явно не пишутся.

                              А, как я забыл, вы же «патриот». Нам с вами лучше не спорить, будет холивар.
                                –2
                                Видите ли, 90% населения России знает русский лучше, чем английский. Никуда от этого не деться, патриот вы или нет. И дело не в патриотизме, этот баг и китайский URL затрагивает.
                                  +1
                                  Видимо, вы бы хотели, чтобы цифра 90% и не менялась.

                                  И зачем «знать» язык, чтобы написать имя домена? А вот вообще не знать слов английского, чтобы вот полностью, это стыдно должно быть.
                                    +1
                                    Вы молодой ещё, думаю. Дело не в том, стыдно, не стыдно, хотел бы, не хотел бы. Дело в том, что сайт создаётся для задачи — скажем, заработать денег мильён. И эта задача является главной, а не поднять процент пользователей Интернета в России, хорошо запоминающих URL на латинице.
                                    Кроме того, есть много невозможных на латинице названий, вроде юриспруденция, борщ или овощи. Ovoshchi.ru — красиво выглядит, намного лучше, чем овощи.рф, да? Есть также названия, незапоминающиеся для не знающих английского: bicycles.ru вместо велосипеды.ру или одежда.рф вместо odezhda.ru
                                      0
                                      в точку! :)
                                      0
                                      90%? Думаю, все 95%.

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

                                      Хотя мне, как человеку, свободно владеющему английским, такая ситуация очень не приятна. Но что делать, изменить все равно ни чего нельзя.
                                        0
                                        А что тут неприятного? Знание или незнание языка ещё не делает человека лучше.
                        +5
                        А это не вам решать. Есть сайт «президент.рф» — обязаны обеспечить доступ. Не можете — вон из профессии.
                          –2
                          Кто кому и что обязан?
                            +2
                            «Любой вменяемый айтишник», которого artifex учит жить в комментарии выше, есть существо подневольное и обязанное выполнять поставленную перед ним нанимателями задачу — а именно, поддерживать в рабочем состоянии ИТ-инфраструктуру.
                              +1
                              Если некий Медведев не может просмотреть на своём айфоне флеш-ролик с президент.рф, то ему не поможет даже самый квалифицированный айтишник ;)
                                0
                                а вот нихуя. все зависит от задачи.
                                0
                                да вы батенька, балван! :)
                                  0
                                  искренне прощу прощения, вырвалось
                            0
                            А если кодировать адрес в punycode в приложении, в вашем случае используя например Flash IDNA?
                              +2
                              .РФ детище маркетологов, только им и нужен.
                                +10
                                flash не нужен.
                                .РФ не нужен.

                                Flash +.РФ. Что делать?
                                  –1
                                  Не нужно быть таким категоричным. Я имею в виду первый пункт.
                                    0
                                    Жить дальше день за днём.

                                    Флешеры, что мне попадались, яростно тупят на тему того, откуда им грузить файлы с параметрами. Или страстно желают параметры в xml, как будто flashvars ещё не изобрели.

                                    Покусали их всех, что ли.
                                      0
                                      Работать с flashvars крайне не удобно. Любой уважающий себя флешер сделает альтернативный xml конфиг для отладки.
                                        0
                                        А что прикажете делать, если один и тот же ролик должен вертеться на 150 страницах с разными аргументами?

                                        Речь тут не об удобстве, а о том, работает или нет.
                                          0
                                          Если там просто баннер, то да. Если что-то сложнее, то выделяется под это дело сервер который и конфигурирует флеш. Серверу просто передаются флешварсы и он возвращает в ответ стандартизированый xml. Просто на стороне флеша поддерживать 150 сайтов в актуальном состоянии это нереально.
                                            0
                                            Баннер, плеер, примерочный интерфейс для интернет магазина.
                                            Параметры — имя файла, идентификатор валюты и курс валюты, язык интерфейса.

                                            Понятное дело, что строки для языков будут в xml. Но уже с этим у некоторых проблемы, откуда их тащить. Ведь страшно подумать, флешка не обязательно будет загружаться из корня домена.
                                              0
                                              Ну все от задачи зависит. Т.е. я лично сразу выношу всю кухню на сервер. Задача флеша предоставлять gui, а не разбираться где он сейчас работает и куда ему стучаться.
                                                +1
                                                Задача флеша — делать то, что требуется. Ровно как и задача любого другого компонента системы.

                                                PHP программист берёт параметры из базы, ini файла, get/post — запроса, переменных сессии, кукисов, анализирует, где он находится, чтобы скрипт выполнялся в нужном контексте, а флешер почему-то не может, сложно ему.
                                                  0
                                                  Это у вас какие-то армейские способы разработки. Если имеет смысл вынести определение параметров окружения на сервер, то это стоит делать. Флешеры обычно и так всегда в отстающих.
                                                    0
                                                    Обычные методы. Задачи просто разнообразные.
                                                    XML файл — пожалуй самый неудобный способ передавать параметры во флеш, если этими параметрами необходимо оперативно управлять.
                                                      0
                                                      e4x просто прекрасен. Лучшего способа работы с xml я не встречал.
                                                        0
                                                        Вот вам флешка, сделайте так, чтобы мне можно было менять картинки из админки сайта.

                                                        Если e4x это может, то снимаю шляпу.
                                                          0
                                                          А xml уже генерировать нельзя разве?
                                                            0
                                                            Можно, но что делать, если флешка одна, а разных параметров для неё несколько?
                                                            Может лучше кому-то сесть за учебники?
                                    +5
                                    Нужно не симптомы болезни лечить, а саму болезнь.
                                    А если вы ещё не поняли, что ".РФ" ничем кроме болезни быть не может, значит вам об этом через годик расскажет статистика. Пожалейте по крайней мере свое личное время.
                                      0
                                      предлагаю устроить тотализатор, делаем ставки и встречаемся 16.02 2012, поглядим статистику? :)
                                        0
                                        А на что ставите вы? Какие у вас ощущения от.РФ?
                                          0
                                          мои ощущения? на мой взгляд рф был создан для бизнеса (для печатных сми и пр.) об этом тут тоже писали. Для редиректа (как написано в комменте ниже), для упрощения восприятия, для того — что часть населения это не it спецы и не продвинутая молодёжь, простые люди которые знают минимум о компьютерах (достаточно чтобы смотреть видео и читать новости). Можно говорить о необходимости развития и изучения английского языка — это всё хорошо, но это утопично. Мой диагноз? Будет жить! Сам владею десятком доменов в этой зоне, и по мне так оченьудобно.рф
                                      +13
                                      Клиентов приучаем использовать и сами используем домен в зоне .PФ просто для редиректа.

                                      Как правило всегда применяем такую схему редиректов:
                                      www.site.ru → (301) → site.ru
                                      сайт.рф → (301) → site.ru
                                      ввв.сайт.рф → (301) → site.ru

                                      В итоге всё шоколадно — и продвигать нужно всего один домен (site.ru), и есть кириллический домен для рекламы в газетах, например.

                                      Использовать .PФ как основной домен и тем более, как некоторые умудряются, сажать его в электронную почту ( майл@сайт.рф, салес@сайт.рф, суппорт@сайт.рф :-D ), по-моему удел глупцов.
                                        +3
                                        Из обсуждения я понял, что описанная в топике проблема возникает, возможно, из-за нелюбви Mozilla Foundation к доменной зоне РФ :-)
                                          0
                                          Mozilla Foundation любит «.рф» и поддерживает его в Firefox.

                                          Проблемы во флэшёвом плагине и в его взаимодействии с Файерфоксом. Тут надобно не только Фонду Мозиллы, но и Системам Адоуби помыслить об исправлении. Соборно.
                                            0
                                            мозилой пользуются только сумашедшие айтишники (из-за firebug'a)))):))))! человеки используют Chrome, Opera и IE :)))
                                          +2
                                          Что у вас со скриншотами?
                                            0
                                            Для того чтобы узнать что именно происходит с политикой,
                                            надо смотреть policyfiles.txt а не догадываться по картинкам.
                                              +2
                                              Хочу предупредить уважаемых читателей: ставить * в crossdomain можно *только* если на этом домене у вас хранятся статические файлы, и нет скриптов, личных кабинетов, кук, логина, пользовтаелей и прочего. Иначе через открытую CSRF у вас разломают весь сайт.
                                                +1
                                                Можно подробнее, пожалуйста?
                                                +1
                                                Если так охота иметь домен.рф, то просто ставьте на нём редирект на основной латинский домен.
                                                  +3
                                                  Оставьте домены рф для наших чиновников :) Пусть сами все их скупают, сами себе же их продают и пусть вообще продолжают жить в своем мирке.
                                                    +2
                                                    Если Вы так основательно подошли к такой никчемной проблеме, тогда почему Вы так же не подошли к проблеме кириллических доменов еще в зародыше? Зачем себе же создавать траблы на свою жопу?
                                                    Решение может быть только одним в этом случае — редирект. И флеш работает, и админы не в панике, и люди не страдают.
                                                      +2
                                                      Flash +.РФ. Что делать? -> Поставить редирект и не мучиться.
                                                        –1
                                                        Насколько я понимаю, есть два зеркала сайта — в.рф и .ru. Загоните флеш в iframe и грузите его всегда с .ru.
                                                          0
                                                          Речь о сложных случаях, когда редирект не подойдёт…
                                                          0
                                                          Наверняка многие разработчики в целях защиты предпочитают «хардкодить» имена сайтов во флэшки, и наверняка многие предпочитают выносить эти адреса в параметры.

                                                          тупо ломается любым флеш-дизассемблером.
                                                            0
                                                            для любителей выпендриться и зарегить домен в зоне рф проще всего просто настроить редирект с этого домена на латинский и не орошать никому мозг.
                                                              0
                                                              Это для любителей выпендриться и зарегистрировать домен только в зоне.рф
                                                              0
                                                              что делать — бойкотировать этот бред с китайскоарабским интернетом. чем я и занимаюсь
                                                                0
                                                                Спасибо! Проблема была насущной для одного проекта, пока был редирект на .ru
                                                                  0
                                                                  Пожалуйста, для этого и написал :-)
                                                                  0
                                                                  для кириллических GET-запросов (например поиск):

                                                                  function decode_utf8( s:String ):String {
                                                                  return decodeURIComponent( escape( s ) );
                                                                  }

                                                                  function encode_utf8( s:String ):String {
                                                                  return unescape( encodeURIComponent( s ) );
                                                                  }

                                                                  Может и в этом случае поможет.

                                                                  Only users with full accounts can post comments. Log in, please.