Выполнение запроса AJAX другому серверу
У меня есть код AJAX, где, если вы запрашиваете вызов AJAX на удаленный сервер, запрос не выполняется:
function loadXMLDoc() {
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else {
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", "http://www.google.com", true);
xmlhttp.send();
}
Что я могу сделать, чтобы решить эту проблему?
Ответы
Ответ 1
Похоже, вы столкнулись с той же политикой происхождения. Вы должны использовать относительный путь вместо своего абсолютного пути http://www.google.com
.
В качестве одного из возможных способов решения вы можете создать очень простой обратный прокси (с mod_proxy, если вы используете Apache). Это позволит использовать относительные пути в вашем запросе AJAX, в то время как HTTP-сервер будет действовать как прокси-сервер в любом местоположении "remote".
Основной конфигурационной директивой по настройке обратного прокси в mod_proxy является ProxyPass. Обычно вы используете его следующим образом:
ProxyPass /web-services/ http://third-party.com/web-services/
В этом случае браузер будет запрашивать /web-services/service.xml
, но сервер будет обслуживать это, действуя как прокси-сервер для http://third-party.com/web-services/service.xml
.
Другим распространенным обходным решением будет использование JSONP.
Ответ 2
В качестве меры безопасности AJAX не позволяет отправлять запросы другим доменам. Кросс-домен Ajax: краткое резюме обсуждает несколько способов решения этой проблемы. Самый простой способ - использовать ваш сервер в качестве прокси для загрузки удаленного контента:
Это один из самых распространенных подходов. Ваш script вызывает ваш сервер, ваш сервер делает звонок на удаленный сервер, а затем возвращает результат клиенту. Для этого подхода есть определенные преимущества: у вас больше контроля над всем жизненным циклом. Вы можете анализировать данные с удаленного сервера, делать с ним то, что вы будете перед отправкой обратно клиенту. Если что-то не удается по пути, вы можете справиться с этим по-своему. И, наконец, вы можете регистрировать все удаленные вызовы. Если вы сможете отслеживать успех, неудачу и популярность.
Ответ 3
Вы можете использовать динамическую загрузку script. Вот статья, о которой я писал об этом.
Ответ 4
Я хотел опубликовать еще один вариант ответа сверху. Я попытался использовать ProxyPass
в моем файле .htaccess, но я продолжал получать внутренние ошибки обслуживания. Наконец, после некоторого чтения я обнаружил, что существует другой способ сделать это с помощью механизма перезаписи.
RewriteEngine On
RewriteRule ^mail.php$ http://otherwebsite.com/mail.php [P,L]
P in [P,L]
сообщает системе перезаписи, что она использует mod_proxy
. Это сработало для меня, и я не получил внутренних ошибок сервера.
Преимущество этого подхода заключается в том, что он использует Rewrite Engine
, у вас больше контроля над переменными, которые могут потребоваться для динамической отправки на script.