Ошибка Ajax – «разрешение отклонено»

Извините, это выглядит дольше, чем возможно, но я думал, что должен включить всю информацию!

Я использую простой скрипт 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'; } ?> 

Solutions Collecting From Web of "Ошибка Ajax – «разрешение отклонено»"

Вы попали в ситуацию междоменного запроса. Запросы 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, поэтому прокси-сервер также может находиться в удаленном домене.

У меня есть пример:

http://json-proxy.jgate.de/

Вот еще один специально настроенный для использования ресурсов XML и ответа с помощью JSON.

http://jsonproxy.appspot.com/

 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; };