Подтвердить что ты не робот

Доступ запрещен в IE 10 и 11, когда целью ajax является localhost

Я пытаюсь выполнить вызов ajax между сервером (http), который находится в Интернете. И нацелитесь на мой собственный локальный хост. FF/Chrome/ETC... работает. Это ТОЛЬКО проблема IE. IM ИСПОЛЬЗОВАНИЕ IE 11 И 10.

Запрос даже не сделан. "Запрещенный доступ" запускается мгновенно.

Это код. Просто для вас.

Не классическая ошибка HTTP/HTTPS в IE8 и IE9. Это что-то еще, но документация не помогает.

$jq.ajax({
            contentType: 'application/json',
            url: url,
            dataType: 'json',
            crossDomain: true,
            beforeSend: function (xhr) {
                xhr.withCredentials = true; 
                xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password));
            },
            success: function (data, status, headers) {},
            error: function (xhr, status, error) {}

Статус 0 в объекте xhr, а ошибка - "Запрет доступа"

4b9b3361

Ответ 1

Internet Explorer вызывает эту ошибку как часть ее функций зон безопасности. Используя настройки безопасности по умолчанию, при попытке доступа к ресурсу в зоне "Местная интрасеть" из источника в зоне "Интернет" возникает ошибка "Отказано в доступе".

Если вы пишете свой код Ajax вручную, Internet Explorer будет вызывать ошибку при попытке открыть ресурс. Например:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost/', true); // This line will trigger an error
xhr.send();

Вы можете обойти эту ошибку, добавив исходный сайт в зону безопасности "Надежные сайты". Вы можете проверить это, добавив "http://client.cors-api.appspot.com" в зону "Надежные сайты" и используя эту тестовую страницу в test-cors.org с вашим сайтом localhost как удаленным URL.

Ответ 2

В дополнение к требованию доверенного узла я обнаружил, что проблема не была исправлена ​​до тех пор, пока я не использовал тот же протокол для запроса как мой источник, например. мой тестовый сайт размещался на https, но не удался с каким-либо пунктом назначения, используя http (без s).

Это относится только к IE, Chrome просто вежливо регистрирует предупреждение в консоли отладки и не прерывается.

Ответ 3

Если вы пытаетесь сделать запросы ajax с перекрестным происхождением в IE9, вам нужно использовать XDomainRequest вместо XMLHttpRequest. Существует подключаемый модуль jQuery, который включает XDR. Вы должны знать, что есть некоторые заметные ограничения XDR.

Другой вариант - использовать такую ​​библиотеку: https://github.com/jpillora/xdomain.

Ответ 4

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

В этой статье хорошо объясняется проблема. jQuery реализует вызовы ajax с использованием объекта XMLHttpRequest, который не поддерживается в IE9. Вы должны заставить его использовать XDomainRequest вместо этого.

Я обойду эту проблему, используя этот плагин jQuery:

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

Ответ 5

Примечание:

Не используйте " http://www.domain.xxx" или " http://localhost/" или "IP" для URL-адреса в Ajax. Используйте только путь (каталог) и имя страницы без адреса.

ложное состояние:

var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.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', 'dir/getSecurityCode.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;
};