Вопрос о запросе ajax междоменного (субдомена)
Скажем, у меня есть главная страница, загруженная из 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/.
Ответы
Ответ 1
Перекрестный домен - это совсем другой предмет. Но кросс-поддомен относительно прост. Все, что вам нужно сделать, это установить для document.domain одинаковое значение как на родительской странице, так и на странице iframe.
document.domain = "yourdomain.com"
Подробнее здесь
Ответ 2
Еще одно решение, которое может или не может работать для вас, - это динамически вставлять/удалять теги script в 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>
Ответ 3
Все современные браузеры поддерживают CORS, и впредь мы должны использовать это дополнение.
Он работает на простой технике рукопожатия, поскольку 2 домена обмениваются доверием друг с другом посредством HTTP-заголовков, отправленных/полученных. Это было долгождано, поскольку одна и та же политика происхождения была необходима, чтобы избежать XSS и других вредоносных попыток.
Чтобы инициировать запрос перекрестного происхождения, браузер отправляет запрос с HTTP-заголовком Origin. Значение этого заголовка - это сайт, который обслуживал страницу. Например, предположим, что страница http://www.example-social-network.com пытается получить доступ к пользовательским данным в онлайн-альбоме -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 вместо ответа on-line-calendar.com.
Чтобы разрешить доступ ко всем страницам, сервер может отправить следующий заголовок ответа:
Access-Control-Allow-Origin: *
Однако это может оказаться неприемлемым для ситуаций, в которых проблема безопасности.
Очень хорошо объяснено здесь на странице wiki.
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
Ответ 4
Другим обходным путем является направить запрос ajax на страницу php (например) в вашем домене и на этой странице сделать запрос cURL в подобласте.
Ответ 5
Новая идея: если вы хотите перекрестный субдомен (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!
Ответ 6
Самое простое решение, которое я нашел, это создать php для вашего поддомена и включить в него исходный файл функции с полным путем.
Пример:
www.domain.com/ajax/this_is_where_the_php_is_called.php
субдомен:
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" );
Теперь вызовите 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);
Пример такой же простой, как я могу это сделать. Вы можете использовать более качественные отформатированные пути.
Надеюсь, это поможет кому-то. Здесь нет ничего грязного, и вы вызываете исходный файл, поэтому любые изменения будут применяться ко всем функциям.
Ответ 7
Я написал решение для кросс-субдомен и работал над моими приложениями. Я использовал iframe и установил document.domain = "domain.com" с обеих сторон. Вы можете найти мое решение по адресу:
https://github.com/emphaticsunshine/Cross-sub-domain-solution