Кросс-субдомен 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, если мне это не нужно. Невозможно ли выполнить регулярные аякс-запросы через поддомены?
Любая помощь очень ценится.
Ответы
Ответ 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');