Отправка AJAX-запроса на другой сервер - PullRequest
15 голосов
/ 17 мая 2010

У меня есть код 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();
}

Что я могу сделать, чтобы решить эту проблему?

Ответы [ 4 ]

16 голосов
/ 17 мая 2010

Похоже, вы столкнулись с той же политикой происхождения . Вы должны использовать относительный путь вместо вашего абсолютного http://www.google.com пути.

В качестве одного из возможных обходных путей вы можете настроить очень простой обратный прокси mod_proxy , если вы используете Apache). Это позволит вам использовать относительные пути в вашем AJAX-запросе, в то время как HTTP-сервер будет действовать как прокси для любого «удаленного» местоположения.

Основная директива конфигурации для настройки обратного прокси в 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 .

3 голосов
/ 17 мая 2010

В качестве меры безопасности AJAX не позволяет отправлять запросы другим доменам. Междоменный Ajax: краткий обзор обсуждает несколько способов решения проблемы. Самый простой способ - использовать ваш сервер в качестве прокси для загрузки удаленного контента:

Это один из самых распространенных подходов. Ваш скрипт вызывает ваш сервер, ваш сервер выполняет вызов на удаленный сервер, а затем возвращает результат обратно клиенту. У этого подхода есть определенные преимущества: у вас больше контроля над всем жизненным циклом. Вы можете анализировать данные с удаленного сервера, делать с ними все, что хотите, прежде чем отправлять их обратно клиенту. Если что-то пойдет не так, вы можете справиться с этим по-своему. И, наконец, вы можете регистрировать все удаленные звонки. С тем, что вы можете отслеживать успехи, неудачи и популярность.

0 голосов
/ 27 декабря 2013

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

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

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

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

0 голосов
/ 17 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...