Выполнение запроса 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 вызывает ваш сервер, ваш сервер делает звонок на удаленный сервер, а затем возвращает результат клиенту. Для этого подхода есть определенные преимущества: у вас больше контроля над всем жизненным циклом. Вы можете анализировать данные с удаленного сервера, делать с ним то, что вы будете перед отправкой обратно клиенту. Если что-то не удается по пути, вы можете справиться с этим по-своему. И, наконец, вы можете регистрировать все удаленные вызовы. Если вы сможете отслеживать успех, неудачу и популярность.

Ответ 4

Я хотел опубликовать еще один вариант ответа сверху. Я попытался использовать ProxyPass в моем файле .htaccess, но я продолжал получать внутренние ошибки обслуживания. Наконец, после некоторого чтения я обнаружил, что существует другой способ сделать это с помощью механизма перезаписи.

RewriteEngine On
RewriteRule ^mail.php$ http://otherwebsite.com/mail.php [P,L]

P in [P,L] сообщает системе перезаписи, что она использует mod_proxy. Это сработало для меня, и я не получил внутренних ошибок сервера.

Преимущество этого подхода заключается в том, что он использует Rewrite Engine, у вас больше контроля над переменными, которые могут потребоваться для динамической отправки на script.