Пользователь
0,0
рейтинг
31 мая 2011 в 21:00

Разработка → Cross-domain «ajax» — простое решение

В очередном проекте я столкнулся с необходимостью активно работать с кросс доменными запросами на ajax, тема, как я вижу на хабре особо не поднималась и не освещалась, вот и решил поделиться с читателями свои опытом.

Допустим мы имеем сайт
http://name.my
и хотим на нем использовать ajax и что же мы получим?
  1. Запрос на
    http://name.my/ajax.php
    (буду писать везде php, чтобы всем было удобно, сам же работал с java) вернет нам ответ без проблем
  2. Запрос на
    http://google.com/
    завершится ошибкой доступа
  3. Попытка достучаться до
    https://name.my/ajax.php
    тоже окончится неудачей, сменился протокол
  4. http://name.my:81/ajax.php
    и другой порт в адресе испортит малину

Задача: найти кроссбраузерное решение для отправки запросов которое будет работать: ie7+, opera 9.6+, ff 3+, chrome, safari. А также так как обращаться мне приходилось также с http на https не должно быть сообщения “mixed content” в ie.
В качестве библиотеки на сайте использовалась jQuery и встроенного механизма кросс доменных запросов в ней нет (появилася в 1.5 возможность организовать jsonp но это не всегда подходит), поиск плагинов также не дал результатов. Поэтому, обломавшись с простыми путями (что в принципе и ожидалось), отправился в Google, который тоже не дает очевидного ответа — я больше находил описание методов или же вещи которые мне не подходили (например в dojo есть релизая таких запросов, но менять весь js на сайте очень трудозатратно).
В качестве решения проблемы могли бы использоваться следующие техники:
  1. postMessage
  2. JSONP
  3. CORS
  4. document.domain methods
  5. window.name Transport
  6. Server-side proxy
  7. CRAZY IFRAME STUFF
  8. flash

Новичок, при виде этого списка ужаснётся (в принципе я тоже не в восторге был). Итак наша задача — найти оптимальный путь решения проблемы, который не создавал бы лишних костылей на сайте.
1) postMessage – это новая возможность стандарта HTML5, позволяет отсылать сообщения из одного окна в другое, при этом контент окон может быть с разных доменов. Примерная реализация targetWindow.postMessage(message, targetOrigin); targetWindow — окно куда шлём запроc, message — сообщение, targetOrigin целевой домен который должен быть открыт в окне, допускается указания “*” в качестве домена, при этом домен может быть любой.
2) JSONP (JSON Padding) или «JSON с подкладкой» является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента. Использовав тэг , мы можем обратиться к другим доменам, однако результат придет в виде json ответа, который мы не сможем обработать, jsonp предлагает следующее решение: передавая серверу имя функции, мы получаем в ответе не голые данные, а parseResponse({«paper»: «A4», «count»: 5}), что вызовет функцию parseResponse.
3)CORS тема большая, поэтому расскажу вкратце, кому интересно велкам в w3c документацию. XMLHTTPRequest 2 — это новая спецификация запросов, работает и вызывается как обычный XMLHTTPRequest (в ie это XDomainRequest), но теперь в http заголовок добавляется следующее:
Access-Control-Allow-Origin определяет каким доменам разрешено соединение
Access-Control-Allow-Credentials указывает полномочия на выполнения запроса (Access-Control-Allow-Credentials: «Access-Control-Allow-Credentials» ":" true true: %x74.72.75.65; «true», case-sensitive)
Access-Control-Max-Age — как долго результаты будут кэшироваться.
Также можно определить доступные методы (GET, POST), все дополнительные поля заголовка вы можете посмотреть в спецификации.
Главная проблема метода — его поддерживают далеко не все браузеры, а тем кто захотят использовать реализация от IE — XDomainRequest, не стоит забывать, что IE в своем репертуаре и не позволит вам сделать запрос с протокола http на https, хотя по спецификации запрещены только запросы с https на http ), но это ie.
4) document.domain нам подойдет, если мы хотим общаться с 2 сайтами на общем наддомене, то есть test1.name.my и test2.name.my. Между этими сайтами нормальный запрос не сделать, однако у document есть свойство domain, которое мы можем сменить для обоих окон на name.my и общаться обычным способом через iframe.
5) window.name Transport — заключается в изменении свойста name у windows и передачи таким образом через текст свойства наших сериализованных данных.
6) Server-side proxy — самое простое решение — это проксирование запроса сервером. То есть, name.my делает специальный запрос, например, на особенный URL типа name.my/proxy/name2.my/test.html, и сервер name.my проксирует его на name2.my/test.html.
image7) CRAZY IFRAME STUFF — суть метода в том, что ифреймы, даже находясь на разных доменах, могут общаться друг с другом при помощи изменения идентификаторов фрагментов адресов (идентификатор – то, что стоит в адресе после '#') Путем последовательных изменений #фрагмента образуется поток данных, который может передаваться в обе стороны. Т.к идентификатор фрагмента — текст, то все данные для передачи приходится (де)сериализовать, т.е превращать в JSON + понадобится 2 iframe, дабы не затрагивать адрес видимого окна.
8) flash — использовать флеш в качестве промежуточного интерфейса (отдельная тема, все тонкости которой также тянут на статью)
Поискав в интернете нашел замечательную библиотеку easyxdm.net/wp. Самое вкусное заключается в методе работы, выбирается самый быстрый и современные метод основываясь на браузере и его версии.
  • IE6 and IE7 – используется связка с флешем (Microsoft Security Bulletin MS11-018)
  • IE8+ – используется postMessage
  • Opera 9+ – используется postMessage
  • Firefox 1-2 – используются ifame
  • Firefox 3+ – используется postMessage
  • Safari 4+ – используется postMessage
  • Chrome 2+ – используется postMessage

Для остальных браузеров которые не поддерживают postMessage будет использоваться технология основанная на обмене #hash Функции библиотеки не ограничиваются только ajax но разговор будет в основном о нем.
Итак начну c реализации ajax запроса при помощью easyxdm.
Создаем непосредственно прокси объект для отсылки запросов:
    var xhr = new easyXDM.Rpc({
        remote: "http://name.my/cors/index.html" // путь к провайдеру
    }, {
        remote: {
            request: {} 
        }
    });


easyXDM – это, если так можно назвать статический класс, который не имеет конструктора и реализует паттерн синглтон.
Шлем сам запрос:
xhr.request(
    {
        url: "pathRelativeToRemote/getrest/",  //адрес нашего запроса
        method: "POST",
        data: {foo:"bar"}
    }, function(response) { // функция обработки результата ответа
        alert(response.status);
        alert(response.data);
    }
);


Теперь более подробно: первым параметром мы задаем основные настройки, в частности тут указываем путь к заранее подготовленному файлу “провайдеру” (лежит в архиве с сборкой в папке cors), который должен находи

я на удаленном сервере, он будет проксировать запросы на нужный нам url и посылать нам ответы одним из доступных методов.
Однако не стоит забывать что сюда также надо будет вписать путь до флешки (флешка также прикладывается к либе), через которую будут устанавливать соединение старые версии IE.

Далее мы создаем структуру удаленных методов, сейчас там объявлен request ( в файле name.my/cors/index.html также должна быть создана аналогичная структура методов)
Вызовом функции xhr.request мы отсылаем запрос нашему прокси файлу name.my/cors/index.html, который стучится по url и передает туда параметр data, используя обычный ajax, получив ответ, он шлёт данные (при необходимости разбивая ответ на части) обратно к нашему хосту, где вызывается callback, который мы передали последним параметром.
Немного затронем файл name.my/cors/index.html он является незаменимой частью нашего запроса, во-первых он организует обратный транспорт и прием данных. Во вторых у него есть замечательная плюшка — он реализует CORS своими средствами:
var useAccessControl = true; // разрешаем (true) или запрещаем (false) принимать заголовки от сервера (чтобы случайно сервером не разрешить отсылку данных на сторонний домент)
var alwaysTrustedOrigins = [(/\.?easyxdm\.net/), (/xdm1/)]; // список разрешенных серверов
var remote — объект easyXDM, в котором мы должны реализовать структуру удаленных методов.

А также не забываем подключать маленькую “библиотечку” json2.js которая для старых браузером реализует объект JSON, активно использующийся в easyXDM (при этом easyXDM не мешает вам создать свой сериализатор и передать его в качестве параметра, хотя мне кажется это очень редкая потребность).

У меня в проекте стояла задача слать по аяксу много разных форм, соответственно нужен был удобный инструмент который сериализует и шлет по ajax указанную форму. Выход нашелся сразу в лице плагина jQuery Form, но плагин завязан на jq и следовательно слать кросс доменные запросы отказывается.
Приведу простой способ как внедрить наш кросс доменный запрос в плагин не затронув структуры и оставив jQuery в качестве обработчика обычного ajax.
Имеем в html форму (то что внутри формы нас мало волнует этим займется плагин):
<form action="name2.my" id="myform" method="POST">...</form>

Заранее подготовим наш объект для кросс доменного запроса:
crossAjax = new easyXDM.Rpc({
             remote: 'name2.my/cors', // наш провайдер на удаленном сервере
             swf: 'name.my/easyxdm.swf'
	}, {
             remote: {
             request: {} 
	}
});


Далее приведен код подключения плагина, в котором все поля формы автоматически сериализуются, а url на который мы шлем форму берется из action самой формы (как и метод)
$('#myform').ajaxForm({
    beforeSubmit:  beforeSubmit,  
    success:       showResponse
});


Это метод в котором мы обрабатываем результат, его мы вообще не затрагиваем:
showResponse = function(responseText, statusText, xhr, form){ 
    тут мы что-то делаем с нашим ответом
}


А вот главный фокус будет в beforeSubmit, метод вызывается перед отправкой формы, соответственно тут мы можем как получить уже сериализованные данные так и прервать дальнейшую отправку запроса (что нам и надо):
beforeSubmit = function(arr, form, options) {
    if (options.url.indexOf(location.host)<0) { // если хост удаленный то используем наш метод
        var json = {};
        for (var i = 0; i<arr.length; i++) { // преобразуем сериализованные данные формы в нормальный объект js готовый к нашей сериализации (сама форма их передает в весьма странном виде)
            json[arr[i].name] = arr[i].value;
        }
        crossAjax.request({ // шлем кросс доменный запрос, подставляя наши параметры
                url: options.url,
                method: "POST",
                data: json
            }, function(response) {
                switch (response.status) { // разбираем ответ
                    case 200:
                        showResponse(JSON.parse(response.data), response.status, arr, form)
                        break;
                    default:
                        alert("Error: " + response.status);
                        break;
           }
        });
        return false; //останавливаем нативный ajax запрос от jQ
    }
}


Примерно так можно легко решить проблематичную задачу. Работающие примеры можно найти на сайте библиотеки. На этом я завершаю свой первый «хабрапост».
Сама библиотека
Сергей @Seldon
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (73)

  • +11
    Хм, может я что-то не понимаю, но в JQuery есть crossDomain для $.ajax() api.jquery.com/jQuery.ajax/
    • 0
      О, круто, в 1.5 добавили. Не знал, спасибо.
    • +5
      Это для JSONP — посмотрите исходник, обычный AJAX запрос кроссдоменным от этого не станет
    • –2
      JSONP имеет ряд недостатков:
      1) данные передаются через GET следовательно не айс с безопасностью, а я использовал запросы с http на https и смысл тогда в https если все сливаю в открытом виде, логин пароль явно не передаш.
      2) ограничение на размер данных
      • 0
        а что мешает использовать GET через HTTPS?
        • 0
          Если мы шлем с http на https то сам понимаешь. Скажем форма логина всплывает в попапе и соответственно тут проблема.
          + надо все это дело обрабатывать на сервере, в нашем же случае дополнительной обработки не надо и обычный ajax будет обработан также как и кросс доменный.

          Но вам конечно в каком-то конкретном случае никто это сделать не мешает.
          • +7
            Признаюсь, я ничего не понял. «шлем с http на https, форма логина всплывает...» Пожалуйста, объясните что вы делаете по пунктам.
          • 0
            На самом деле можно просто использовать https для всей страницы, если требуется передача конфиденциальной информации, иначе на странице могут быть подключены незащищенные источники, которые имеют риск оказаться подмененными.
            А вообще, ограничения придумали и продолжают поддерживать не просто так, почему бы не следовать нотации?
            Разумеется, организация вебсервиса-прокси для межпротокольного/междоменного транспорта данных может добавить оверхед на сервер, зато будет больше защищенности и гибкости из-за серверной валидации/фильтрации/кеширования/…
            • 0
              если у нас форма логина в попапе и присутствует на всех страницах https для всего сайта отпадает ибо весь сайт в нем передавать накладно и неправильно по своей сути.

              Вам и тут доступны ограничения с помощью CORS, причем поддерживаются и серверные заголовки
              • 0
                Весь сайт — неправильно, поэтому страницу логона нужно делать минималистичной.
                CORS решит проблему доступности междоменных запросов, но проблема подмены незащищенного содержимого все равно будет. Конечно, если все зависит от ТЗ, если вы пишете форум, вам возможно можно будет немного пожертвовать безопасностью во благо удобства, в отличие от проекта интернет-банка или любого портала, связанного с деньгами пользователей.
      • 0
        1) логин и пароль в JSONP запросе… — мне все казалось, что вместо пароля (если уж так нужно для JSONP) принято передавать ид сессии в куках, а сессию можно поднять и без JSONP. GET over HTTPS не работает, чтоли? :)
        2) размер отправляемых данных ограничен (8KB), а принимаемых безграничен, но JSONP применяют, чтобы данные получать, а не отправлять данные. Отправить можно хоть терабайт на любой домен постом, например через форму.

        Основной недостаток JSON — сложно контролировать сетевые ошибки.
        • +1
          это не JSON — а JSONP и то только через скрипт или фрейм
          • 0
            я про сложность обработки ошибок
          • +1
            Все верно, описался
        • –1
          простите, у меня форма логина на ajax и данный шлются с http на https, какой id я передам если ещё не залогинился + а как сессию поднять? я не хочу в get слать запрос с паролем а открытом виде.
          И опять же для JSONP нужна специальная обработка на сервере отличная от обычного ajax. Опять же проблемы.
          | но JSONP применяют
          у меня и задача так не стоит «принимать данные» есть отправка файлов, а либа кстати позволяет это делать!
          • 0
            Сразу скажу, что я вам не предлагал использовать JSONP, просто уточняю некоторые моменты, которые мне показались странными в вашем коменте. Да и для логина JSONP ну никак не приемлем.

            Для логина обычно делают отдельную страницу, которая открывается по HTTP(S) и пересылает данные тоже по HTTP(S), а уж потом если так нужно редиректятся на HTTP — отработанная схема. Либо создают форму (POST, HTTPS) на основной странице и постят в скрытый фрэйм (страница не перезагружается, успешность авторизации можно смотреть по кукам).

            Не хочу придираться и не защищаю JSONP, но обернуть данные в малюсенькую обертку я уж никак не могу назвать «специальной обработкой».
            • –1
              то есть если я со страницей работаю на ajax и jsonp мне придется всегда писать 2 реализации ответа и учитывать возможность jsonp, тут можно без этого обойтись

              + если как я писал выше надо отправлять много форм плагин jquery form требует большей
              доработки

              + как нам понять, что произошла ошибка при ответе, скажем пол логике юзер увидит бесконечный прелоадер если мы решим как-то отметить факт отсылки запроса

              Я старался предложить наиболее удобное и гибкое решение
              • 0
                странно, если вы работаете с ajax то добавить jsonp это 5 строк кода — если есть параметр callback то оборачиваем в этот калбек тот самый json, который иначе отдается напрямую клиенту
    • 0
      Господа зачем так тролить, если в какой-то вашей ситуации позволительно использовать jsonp то без проблем.
      Моя задача была предложить гибкое и удобное решение для кросс доменных запросов и думаю те кому это интересно и нужно возьмут на заметку.
      Также более-менее объёмный функционал врятли будете браться реализовать на jsonp. Также библиотека предоставляет довольно обширный функционал.
      + отлавливать ошибки на jsonp на порядок сложнее, особенно если послать одновременно несколько запросов. И пользователь может довольно долго ожидать ответа от сервера если мы не предусмотрим таймаут для сброса ожидания запроса (например preloader убрать)

      так что тут ни к чему холиварить, каждая задача должна получить своё решение, универсально и идеального для всех случаем нет
    • 0
      Последний раз, когда его использовали, у него с IE были проблемы.
  • +1
    Скажите, почему у вас тема называется «Cross-domain ajax», а описание идёт 8 техник, 7 из которых не имеют к этой аббревиатуре отношения?
    • +2
      Под ajax обычно большинство понимает запрос данных на js без перезагрузки страницы, не связывая слово ajax c XMLHTTPRequest, а те кто изначально пользуются jquery могу и не знать о существовании оного.
      Не буду отрицать, допустил некорректное выражение, собственно первый пост на хабре. Аббревиатуру ajax взял в ковычки.
      • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Вы не могли бы дать ссылку на определение Аббревиатуры «Ajax», в которой говориться что «Ajax» это только XHR (Как я понимаю вы только этот способ назвали айяксом).

      В самой аббревиатуре про объект XHR нет ни слова, английская википедия называет айяксом группу асинхронных методов обмена с сервером, из которых самым частым транспортом выступает XHR, при этом про эксклюзивность этого объекта на аббревиатуру ничего не говориться. Кстати определение JSONP, находиться в категории айякса.

      Русская же википедия называет три «технологии динамического обращения к серверу „на лету“», называя их одним из принципов аяйкса.

      Jesse James Garrett впервые использовав эту аббревиатуру называл ею целую группу технологий. Тип данных, например, исходя из той статьи, всегда должен был быть XML, а XML всегда должен обрабатываться через XSLT

      Цитата Nicholas C. Zakas
      By now, nearly everyone who works in web development has heard of the term Ajax, which is simply a term to describe client-server communication achieved without reloading the current page. Most articles on Ajax have focused on using XMLHttp as the means to achieving such communication, but Ajax techniques aren't limited to just XMLHttp. There are several other methods.


    • 0
      Здесь описаны два способа междоменного доступа
  • 0
    Насколько помню, в «CRAZY IFRAME STUFF» надо еще локацию фрейма менять на «about:blank», иначе данные из window.name не считаешь.
    • 0
      да, и в Firefox 3+ postMessage не работает, только с 4-й.
      • 0
        имеется ввиду кроссдоменный
      • 0
        developer.mozilla.org/en/DOM/window.postMessage c 3+ уже есть. сама суть таких месаджей кросс доменный запрос
        • 0
          У меня например ни этот тест, ни свои собственные не работали на ff3.6.16/maveric. Ваша библиотека работает на ff3+?
          • 0
            ff3.6.17 тоже не работает (Chrome — работает). А жаль.
          • 0
            моя библиотека работает от ff 1+
          • 0
            точнее это не моя библиотека )) и если недоступен postMessage используются заменители, а так я кинул ссылку на официальную документацию
    • 0
      ну crazy frame не о name говориться а о hash. К windiw.name есть всегда доступ
  • +1
    Готовая библиотека — эт хорошо. Благодрности.

    Вообще для крос домена обычно использую XMLHTTPRequest 2 / XDomainRequest — когда Firefox 3.5, Safari 4/Chrome 3 и IE8 и Flash, прокси и т.п. кога нужны все остальные)

    Вообще почитайте — Обмен данными для документов с разных доменов
    Это:
    Полностью cross-domain
    Прокси
    Script
    Flash
    XhrIframeProxy
    Кросс-доменный скриптинг с общим наддоменом
    XMLHTTPRequest
    HTML5, XDomainRequest

    И продолжение: Обмен данными между доменами. Часть 2.
    HTML5: postMessage
    XMLHTTPRequest 2 / XDomainRequest
    + подборка статей
    • 0
      Я читал эти статьи, развернутых примеров тут нету, я тоже даю краткое описание способов, в этих статьях оно чуть более развернуто. И когда стоит задача «сделать» человеку они не помогут (( ибо ничего реально там не предлагают.

      ie7 к сожалению тоже никуда не деть, если 6 можно опустить то 7 рановато. ну и старая опера имеет немного другие стандартны постмесаджа
  • 0
    >Использовав тэг мы можем обратиться к другим доменам, однако результат придет в виде json ответа который мы не сможем обработать, jsonp предлагает следующее решение: передавая серверу имя функции, мы получаем в ответе не голые данные, а parseResponse({«paper»: «A4», «count»: 5}), что вызовет функцию parseResponse.

    А если не использовать тэг, а просто вызывать .ajax(...) с нужными параметрами?

    Буквально пару дней назад немного ковырялся с jQuery, играл с кросс-доменным AJAX и без проблем получил обычный JSON в ответ на JSONP-запрос.
    Буду дома — кину пример. Ну или пусть TheShock кинет, если раньше меня прочитает это — он мне как раз помогал разобраться с этим делом.
    • 0
      Ну вообще описывая методы я не ориентировался на jq или другие библиотеки, а хотел описать сами методы.
      Во вторых я описал почему не могу взять jsonp в качестве решения. так что тут скорее надо смотреть по ситуации
    • 0
      Обещанный пример: pastebin.com/ApBSSwhN
      AJAX-запрос, запрашивающий цитату из Forismatic и получающий чистый JSON в ответ.
      • 0
        Интересный пример, красиво, элегантно и главное работает!

        Не могли бы вы написать статью подробно объясняющую суть метода?
        Что за библиотеки, какие функции. Более интересны ограничения — прежде всего поддержка старыми браузерами, переходы http<->https и т.д.

  • 0
    Пригодиться, сенкс
  • НЛО прилетело и опубликовало эту надпись здесь
    • –5
      во первых ты ему никак ip стороннего сайта не дашь! это не коммент а фантазия какая-то, причем имхо вы не понимаете что говорите.
      во вторых тебе не дадут сделать запрос на поддомен в твоем случае other.name.my
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          мега просто давно бы все сделали, ip в данном случае к слову вообще не учитывается а берется только домен
          + кроссдоменным запрос считается также если разные протокол и порт

          Не все так просто)
  • –1
    «Простое» решение по-вашему — тяжелая библиотека с кучей костылей? Есть же JSONP, он позволяет почти что угодно сделать, что вам еще нужно? там только вроде ошибки запросов трудно отловить, а так все нормально. Если нужно больше контроля, ставим прокси-скрипт на свой сервер. Вот и все, и проблем меньше, и библиотеку с костылями тащить не надо.
  • +1
    Есть еще метод Кроссдоменный AJAX на основе CSS, хотя он работает не во всех браузерах.
  • 0
    А почему бы не использовать запрос к локальной пхпшке, которая через curl отправляет и получает всё, что требуется?
    Если бы я заморачивался с темой кроссдомена, я бы от curl и начал плясать…
    • +3
      Этот вариант я использовал много раз и честно сказать не пойму, почему об этом в первую же очередь не вспоминают
      • 0
        я указал в списке подобный вариант.
        + если вам нужен запрос с http на https смысл в этом пропадает.

        Да и надо опять же смотреть на ситуацию, что вам надо получить, какие требования предъявляют.
        • +1
          Немного не понял, а почему вы говорите что смысл пропадает?
          • 0
            если вам надо сделать запрос с
            http://name.my/2
            на
            https://name.my/1

            То какой смысл в прокладке на сервере?
            • 0
              а… я думал мы обсуждали кросс-доменные запросы. Так то понятно
              • +1
                различие в портах и протоколах также воспринимается браузером как кросс доменный запрос. К сожалению это так.
                • 0
                  Никогда не приходилось работать с https настолько в плотную. Значит будет универсальная прокладка для запросов, благо curl позволяет
  • 0
    Одно не понимаю: зачем нужны такие ограничения в браузере, если они все равно преодолеваются -> если вебсервер взломан, злоумышленники достигнут цели.
    • 0
      Ограничения нужны для того чтобы у вас скажем куки любо желающий не слил
      • 0
        Так ограничения все равно преодолеваются!
        А вещи типа JSONP вообще больше на хак похожи, чем на нормальную разработку.
        • 0
          вы себе не представляете сколько хаков многие использует при фронтенд разработке сайтов, даже не задумываясь об этом. Ибо сейчас любой браузер не поддерживает стандарты, где-то что-то да не поддерживает, кто-то в большей степени кто-то в меньшей. И это суровая действительность. В отличии от серверной разработке, где можно выставлять требования к серверу и по на нем
  • +1
    А что если добавлять в head элемент script в рантайме? Вроде бы, оно разрешает указывать в src левые хосты?
    • +3
      это JSONP, называйте уж своими именами, он тут в комментариях освещен
  • +1
    Пусть меня и заминусуют, но у Вас серьёзные проблемы с тся/ться, мне было очень сложно читать.
    • 0
      увидел только 2 ошибки в текста с ться, не думаю что проблема, скорее немного не хватило внимательности
      • 0
        Это точно:
        • 0
          [извиняюсь, случайно отправилось]

          8)… все тонкости которой также на тянут статью
  • +1
    Для тех кто столкнулся с проблеммой Cross-domain «ajax»
    Вот простое решение server-side proxy на основе NGINX

    location /api.server.com/
    {
    rewrite \/api.server.com(\/.*)$ $1 break;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass api.server.com;
    proxy_set_header Host api.server.com;
    proxy_connect_timeout 1;
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;
    proxy_intercept_errors on;
    expires 30;
    add_header Content-Type text/javascript;
    break;
    }


    После этого все запросы на http://yousite.com/api.server.com/do_something.ajax через NGINX уйдут на http://api.server.com/do_something.ajax
    • 0
      Хорошее решение если у вас есть возможность влезть в настройки сервера и вы используете NGINX. Конечно такие решения удобны.
      А скажем для Apach+TomCat можно подобное сотворить?
  • +2
    «Не хочу показаться слишком говнистым» (с), но было был классно улучшить форматирование статьи — абзацы, подсветка кода, списки и т.п. Поймите меня правильно, так воспринимать ваш труд будет гораздо удобнее!
  • 0
    Библиотека супер. Мне на днях буквально спасла задницу. Рекомендую, зависимости никакой. RPC между двумя приложениями сделал на раз два.
    • 0
      Как я и писал возможности библиотеки это не только реализация кросс доменного «ajax», возможности шире )) Меня она спасла на проекте, где надо было слать с домена на домен, а также с http на https )) + удобно связать с jq.
  • 0
    Спасибо, как раз это краеугольный камень нашего стартапа. Сейчас пользуемся, CSSHttpRequest, попробуем ваш способ.
    • 0
      Рад если кому-то пригодилась моя статья. Если нужен быстрый и гибкий кросс доменный «ajax» то стоит использовать либу.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.