Подтвердить что ты не робот

Кросс-субдомен ajax-запрос отклонен, даже если document.domain установлен правильно

В моем приложении у меня есть сайт в одном поддомене (dev.u413.com), и я использую jquery, чтобы сделать запрос ajax на JSON api в другом поддомене (api.u413.com). Когда я проверяю запросы в инструментах Chrome dev и Firefox Firebug, кажется, что мои запросы предотвращаются с помощью Access-Control-Allowed-Origin. Я установил document.domain в суффикс текущего домена: document.domain = 'u413.com';.

Вот мой запрос:

    $.ajax({
        dataType: 'json',
        data: { parseAsHtml: true, cli: 'help' },
        url: 'http://api.u413.com/',
        success: function (response) {
            alert(response.Command);
        }
    });

Если я изменил запрос ajax на один домен, запрос будет успешным.

    $.ajax({
        dataType: 'json',
        crossDomain: false,
        data: { parseAsHtml: true, cli: 'help' },
        url: 'http://dev.u413.com/',
        success: function (response) {
            alert(response.Command);
        }
    });

Почему это происходит? Браузер не должен жаловаться на междоменные проблемы, так как я установил document.domain в общий суффикс обоих поддоменов в соответствии с рекомендациями той же политики происхождения.

У меня есть приложение, работающее с jsonp в настоящее время, но я чувствую, что правильные запросы ajax должны работать в соответствии с той же политикой происхождения, с которой я связан выше. Я бы предпочел не использовать jsonp, если мне это не нужно. Невозможно ли выполнить регулярные аякс-запросы через поддомены?

Любая помощь очень ценится.

4b9b3361

Ответ 1

document.domain не работает с AJAX. Он предназначен для междоменного обмена iframe и окна. В вашем случае вы нарушаете ту же политику происхождения (последняя строка в таблице), поэтому вам нужно использовать либо JSONP, либо серверный мост.

Здесь очень отличный путеводитель, который иллюстрирует различные методы для получения запросов AJAX с перекрестными доменами.

Ответ 2

та же самая политика происхождения - одна из самых неприятных тем, связанных с браузером, с которыми мне пришлось иметь дело. Глупо мне, что 2 сервера в одном домене не могут общаться. К сожалению, одна и та же политика происхождения рассматривает даже 2 запроса одного и того же сервера, но в другом порту - нарушение одной и той же политики происхождения. Я думаю, что это улучшится с будущими браузерами:

http://www.html5rocks.com/en/tutorials/file/xhr2/

Искать: Перекрестный поиск ресурсов (CORS)

в основном ваш сервер просто должен установить ответный заголовок, в котором говорится: "Да, можно разрешить перекрестный домен или перекрестные вызовы поддоменов на сервер xyz".

Это будет какое-то время, прежде чем все браузеры подтвердят это. Я уверен (и, черт возьми, я должен поддерживать ie8, пока большинство наших пользователей не отключится от него), но по крайней мере в конце туннеля есть свет.

Ответ 3

Вам нужно добавить document.domain = 'u413.com в ваш другой поддомен.

Ответ 4

Невозможно ли выполнить регулярные аякс-запросы по поддоменам?

Это не технически AJAX, но вы можете имитировать запрос AJAX, когда подача формы успешно переходит в междоменную. Недостатком является то, что вы не можете получить доступ к ответу, и это приведет к перенаправлению страницы в форму ACTION URL.

Вместо этого:

jQuery.post('https://www.com',
    'offerCode':523153,
    'accountNumber':'',
    '_item.x':'42',
    '_item.y':'21'
});

Используйте это:

jQuery('<form action="https://www.com" method="POST">
      <input type="text" name="offerCode" value="523153">
      <input type="text" name="accountNumber" value="">
      <input type="text" name="_item.x" value="42">
      <input type="text" name="_item.y" value="21">
    </form>').trigger('submit');