Вопрос о междоменном (поддомене) ajax-запросе - PullRequest
49 голосов
/ 16 марта 2009

Допустим, у меня загружена главная страница с http://www.example.com/index.html. На этой странице есть js-код, который отправляет запрос ajax на http://n1.example.com//echo?message=hello. Когда ответ получен, обновляется div на главной странице. с телом ответа.

Будет ли это работать во всех популярных браузерах?

Edit:

Очевидное решение состоит в том, чтобы разместить прокси перед www.example.com и n1.example.com и установить его так, чтобы каждый запрос, обращающийся к подресурсу http://www.example.com/n1, передавался по прокси http://n1.example.com/.

Ответы [ 7 ]

138 голосов
/ 06 марта 2010

Кросс-домен - это совсем другая тема. Но перекрестный поддомен относительно прост. Все, что вам нужно сделать, это установить файл document.domain одинаковым как на родительской, так и на странице iframe.

document.domain = "yourdomain.com"

Подробнее здесь

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

18 голосов
/ 30 ноября 2012

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

Он работает по простой методике рукопожатия, когда два домена общаются друг с другом через отправленные / полученные заголовки HTTP. Это было долгожданным, поскольку такая же политика происхождения была необходима, чтобы избежать XSS и других злонамеренных попыток.

Чтобы инициировать перекрестный запрос, браузер отправляет запрос с HTTP-заголовком Origin. Значением этого заголовка является сайт, который обслуживал страницу. Например, предположим, что страница на http://www.example -social-network.com пытается получить доступ к данным пользователя в online-personal-calendar.com. Если браузер пользователя реализует CORS, будет отправлен следующий заголовок запроса:

Происхождение: http://www.example -social-network.com

Если online-personal-calendar.com разрешает запрос, он отправляет заголовок Access-Control-Allow-Origin в своем ответе. Значение заголовка указывает, какие сайты происхождения разрешены. Например, ответ на предыдущий запрос будет содержать следующее:

Access-Control-Allow-Origin: http://www.example -social-network.com

Если сервер не разрешает запрос на отправку из разных источников, браузер выдаст ошибку на страницу example-social-network.com вместо ответа online-personal-calendar.com.

Чтобы разрешить доступ ко всем страницам, сервер может отправить следующий заголовок ответа:

Access-Control-Allow-Origin: *

Однако это может не подходить для ситуаций, в которых безопасность вызывает беспокойство.

Очень хорошо объяснено здесь на вики-странице ниже. http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

18 голосов
/ 16 марта 2009

Другое решение, которое может работать, а может и не работать, - динамически вставлять / удалять теги сценариев в DOM, которые указывают на целевой домен. Это будет работать, если цель возвращает json и поддерживает обратный вызов.

Функция для обработки результата:

<script type="text/javascript">
  function foo(result) {
    alert( result );
  }
</script>

Вместо выполнения AJAX-запроса вы динамически вставляете что-то вроде этого:

<script type="text/javascript" src="http://n1.example.com/echo?callback=foo"></script>
1 голос
/ 22 июня 2012

Самое простое решение, которое я нашел, было создать php на вашем поддомене и включить в него исходный файл функции, используя полный путь.

Пример:

www.domain.com / Ajax / this_is_where_the_php_is_called.php

Subdomain:

sub.domain.com

Создать: sub.domain.com/I_need_the_function.php

Внутри I_need_the_function.php просто используйте include:

include_once ( "/ сервер / путь / public_html / Ajax / this_is_where_the_php_is_called.php"); * 1 020 *

Теперь вызовите sub.domain.com/I_need_the_function.php из вашего javascript.

var sub="";
switch(window.location.hostname)
{
case "www.domain.com":
sub = "/ajax/this_is_where_the_php_is_called.php";
break;
case "domain.com":
sub = "";
break;
default: ///your subdomain (or add more "case" 's)
sub = "/I_need_the_function.php";
}


xmlHttp.open("GET",sub,true);

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

Надеюсь, это кому-нибудь поможет. Здесь нет ничего грязного - и вы вызываете оригинальный файл, поэтому любые изменения будут применяться ко всем функциям.

1 голос
/ 27 ноября 2011

Новая идея: если вам нужен перекрестный поддомен (www.domain.com и sub.domain.com), и вы работаете на Apache. все может стать намного проще. если поддомен на самом деле является подкаталогом в public_html (sub.domain.com = www.domain.com/sub/. поэтому, если у вас есть ajax.domain.com/?request=subject...вы можете сделать что-то вроде этого: www .domain.com / Ajax /? = запрос предмет

работает для меня как оберег, и никаких глупых хаков, прокси или сложных вещей для всего лишь нескольких запросов Ajax!

1 голос
/ 30 ноября 2009

Другой обходной путь - перенаправить запрос ajax на страницу php (например) в вашем домене и на этой странице сделать запрос cURL на поддомен.

0 голосов
/ 14 февраля 2012

Я написал решение для кросс-домена и оно работает для моих приложений. Я использовал iframe и установил document.domain = "domain.com" с обеих сторон. Вы можете найти мое решение по адресу:

https://github.com/emphaticsunshine/Cross-sub-domain-solution

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