Извините, это выглядит дольше, чем возможно, но я думал, что должен включить всю информацию!
Я использую простой скрипт Ajax для динамического добавления контента в <div> на странице. Первый запрос на загрузку какого-либо нового контента в div работает отлично, но если у меня есть ссылка «назад» Ajax в только что загруженном контенте, кажется, что она выдает ошибку.
Даже незнакомец, он работает в моей офисной сети, но он терпит неудачу. Если я нахожусь в домашней сети или в сети VPN. Если это не удается, эта ошибка появляется в отладчике JavaScript:
Line: 12 Char: 11 Error: Permission Denied Code: 0 URL: http://www.example.com/about.php
Код действительно не такой сложный, это просто немного взломанная версия материала на веб-сайте W3, но тот факт, что обратный вызов «отрицается», меня сбивает с толку. Будет ли что-то в конфигурации сервера IIS останавливать атаки на сценарии? (Случайная мысль?)
Любая помощь оценивалась;)
Сначала – сценарий Ajax
var myHttpRequest = false; if(window.XMLHttpRequest) myHttpRequest = new XMLHttpRequest(); else if(window.ActiveXObject) myHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); function loadContent(source, content) { if(myHttpRequest) { var data = document.getElementById(content); myHttpRequest.open("GET",source); data.innerHTML = '<div class=\"loading_image\"><img src=\"images/loading.gif\" width=\"54px\" height=\"55px\" alt="loading" /></div>'; myHttpRequest.onreadystatechange = function() { if(myHttpRequest.readyState==4) data.innerHTML = myHttpRequest.responseText; $('#col2_2_content').supersleight(); } myHttpRequest.send(null); } }
Тогда это усеченный пример страницы, которая вызывает содержимое Ajax и имеет div_col__________________состояния, где все вставлено. Файл ajax.js
в разделе главы.
<div id="col2_2_content"> <div class="mugshot_container"> <img src="images/mugshot_dh.jpg" onClick="loadContent('about/dh.php?ajax=yes', 'col2_2_content');"/> </div> </div>
И это код из about/dh.php
который вставлен через Ajax вместе с форматированием PHP, чтобы решить, что нужно вернуть. (Он предназначен для вызова напрямую – в этом случае он получает заголовок / нижний колонтитул, обернутый вокруг).
<?php $home_url = "http://www.example.com/url/"; $content = " <p>Some Text</p> <p><a onClick=\"loadContent('$home_url/about/about-main.php?ajax=yes', 'col2_2_content');\">Back</a></p> "; if (isset($_REQUEST['ajax']) ) { echo $content; } else { include_once 'about-header.php'; echo $content; include_once 'about-footer.php'; } ?>
Вы попали в ситуацию междоменного запроса. Запросы AJAX в основном могут быть сделаны только на сервере, который обслуживал страницу. Поэтому, если ваша страница скрипта загружена с http://website.com/url
, вы можете сделать любой звонок по http://website.com/
но любой вызов на сайт http://url.com
завершится неудачно.
Сказав это, можно вызвать http://s1.example.com
из http://s2.example.com
если вы запустите document.domain = "example.com"
.
Но если вам действительно нужно получить доступ к данным через домены, есть несколько способов сделать это. Самый простой, который я знаю, это использовать <script>
для выполнения запроса. Вы можете отредактировать свой документ, чтобы добавить <script>
с любым src
вам нравится, и браузер пойдет туда и извлечет скрипт для вас. Поэтому, если вы контролируете http://url.com
, вы можете просто создать javascript вместо HTML-страницы, и этот скрипт будет загружен и выполнен. Этот метод используется для работы JSONP.
Межсайтовый скриптинг может работать без проблем безопасности в локальной сети, поскольку IE не устанавливает в этом случае слишком много ограничений. Я сомневаюсь, что он будет работать в любом другом браузере даже в вашей локальной сети.
«Permission denied» звучит подозрительно, как если бы у вас были одинаковые проблемы с политикой происхождения .
Является ли $home_url
расположенным в том же домене, что и страница, которая обрабатывает запрос XMLHTTP?
Разрешение отклонения ошибки почти всегда происходит из-за попытки запросить контент по доменам или зонам безопасности … ( http://msdn.microsoft.com/en-us/library/ms537505%28VS.85%29.aspx#xdomain ) Тем более, что вы видите это через VPN, а не в офисе, похоже, это может быть проблемой.
Я запустил Firebug или какой-нибудь другой инструмент отладки, который позволит вам узнать, что такое запрос.
Учитывая все ответы, уже опубликованные. Я бы предложил использовать относительные URL-адреса. Я считаю, что XMLHttpRequest может пересекать домен в последних браузерах. Спецификации для этого были выпущены некоторое время назад W3C.
Я считаю, что это так: http://www.w3.org/TR/access-control/
Вы также можете использовать теги динамического сценария, если хотите перейти на перекрестный домен. Это кажется самым популярным. Обычно это реализуется с помощью страницы javascript, на которой обращается обратный вызов, а JSON – как параметр.
Существует множество других способов включения кросс-домена http в браузере, но все они связаны с предварительной настройкой, если вы не используете прокси-сервер. Фактически вы можете использовать прокси-сервер, отвечающий на Javascript, поэтому прокси-сервер также может находиться в удаленном домене.
У меня есть пример:
Вот еще один специально настроенный для использования ресурсов XML и ответа с помощью JSON.
if ($_SERVER['HTTP_HOST'] == "mysite.com") { $home_url = "http://mysite.com/testing/rebrand/"; } else { $home_url = "http://www.mysite.com/testing/rebrand/"; }
Не могу опубликовать это в комментариях, поэтому поместив его сюда;)
Это сделало трюк – я добавил это в config.php, чтобы провести различие между доменами. Все теперь работает A-OK. Спасибо, парни 🙂
Примечание. Примечание.
не используйте « http://www.domain.xxx » или « http: // localhost / » или «IP >> 127.0.0.1» для URL-адреса в ajax. используйте только путь (каталог) и имя страницы без адреса.
ложное состояние:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST', 'http://www.example.com/dir1/dir2/page.php', true); AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);
истинное состояние:
var AJAXobj = createAjax(); AJAXobj.onreadystatechange = handlesAJAXcheck; AJAXobj.open('POST','dir1/dir2/page.php', true); // <<--- note AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); AJAXobj.send(pack);
function createAjax() { var ajaxHttp = null; try { if(typeof ActiveXObject == 'function') ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP"); else if(window.XMLHttpRequest) ajaxHttp = new XMLHttpRequest(); } catch(e) { alert(e.message); return null; } //------------- return ajaxHttp; };