IE9 jQuery AJAX с CORS возвращает " Доступ запрещен"

следующие работы во всех браузерах кроме IE (Я тестирую в IE 9).

jQuery.support.cors = true;
...
        $.ajax(
            url + "messages/postMessageReadByPersonEmail",
            {
                crossDomain: true,
                data: {
                    messageId       : messageId,
                    personEmail     : personEmail
                },
                success: function() {
                    alert('marked as read');
                },
                error: function(a,b,c) {
                    alert('failed');
                },
                type: 'post'
            }
        );

у меня есть другая функция, которая использует dataType: 'jsonp', но мне не нужны данные, возвращаемые при этом вызове AJAX. Мое последнее средство-вернуть какую-то ерунду, завернутую в JSONP, чтобы заставить ее работать.

любые идеи, почему IE завинчивается с запросом CORS, который не возвращает никаких данных?

12 ответов


Это известная ошибка С помощью jQuery. Команда jQuery не планирует поддерживать это в core и лучше подходит в качестве плагина.(См.--7-->комментарий). Т. е. не не использовать XMLHttpRequest, но альтернативный объект с именем XDomainRequest.

здесь is плагин для поддержки этого в jQuery, который можно посмотреть здесь: https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

редактировать Функция $.ajaxTransport регистрирует фабрику транспортера. Используется транспортер внутри by $.ajax для выполнения запросов. Поэтому Я ... --9-->предположим вы должны быть в состоянии назвать $.ajax как обычно. Информация о перевозчиках и расширении $.ajax можно найти здесь.

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

две другие Примечания:

  1. объект XDomainRequest был введено из IE8 и не будет работать в версиях ниже.
  2. из IE10 CORS будет поддерживается с помощью обычного XMLHttpRequest.

Edit 2: Проблема http-https

запросы должны быть нацелены на ту же схему, что и страница хостинга

этот ограничение означает, что если ваша страница AJAX находится на http://example.com, тогда ваш целевой URL также должен начинаться с HTTP. Аналогично, если ваш Ajax в разделе https://example.com, тогда ваш целевой URL также должен начинаться с HTTPS.

источник: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx


основываясь на принятом ответе @dennisg, я успешно выполнил это, используя С помощью jQuery.XDomainRequest.js на MoonScript.

следующий код работал правильно в Chrome, Firefox и IE10, но не удалось в IE9. Я просто включил скрипт, и теперь он автоматически работает в IE9. (И, вероятно, 8, но я не тестировал его.)

var displayTweets = function () {
    $.ajax({
        cache: false,
        type: 'GET',
        crossDomain: true,
        url: Site.config().apiRoot + '/Api/GetTwitterFeed',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            for (var tweet in data) {
                displayTweet(data[tweet]);
            }
        }
    });
};

полные инструкции о том, как это сделать с помощью плагина "jQuery-ajaxTransport-XDomainRequest" можно найти здесь: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

этот плагин активно поддерживается и обрабатывает HTML, JSON и XML. Файл также размещен на CDNJS, поэтому вы можете напрямую удалить скрипт на свою страницу без дополнительных установка: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js


проблема в том, что IE9 и ниже не поддерживают CORS. XDomainRequest поддерживает только GET / POST и text/plain conten-type как описано здесь: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

поэтому, если вы хотите использовать все HTTP-глаголы и / или json и т. д., Вам нужно использовать другое решение. Я написал прокси, который будет изящно понижаться до проксирования, если используется IE9 или меньше. Вы не должны измените код вообще, если вы используете ASP.NET.

решение состоит из двух частей. Первый-это скрипт jquery, который подключается к обработке jQuery ajax. Он автоматически вызовет веб-сервер, если будет сделан запрос crossDomain и браузер IE:

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

на вашем веб-сервере вы должны получить запрос, получить значение из http-заголовка X-CorsProxy-Url и выполнить HTTP-запрос и, наконец, вернуть результат.

мой блог : http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/


Я только что сделал все запросы JSONP потому что это было единственное решение для всех наших поддерживаемых браузеров (IE7+ и постоянных пользователей). Имейте в виду, ваш ответ технически работает для IE9, поэтому у вас есть правильный ответ.


получение междоменного JSON с jQuery в Internet Explorer 8 и более новых версиях

очень полезная ссылка:

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

может помочь с проблемой возврата json из запроса домена X.

надеюсь, это кому-то поможет.


основываясь на решении MoonScript, вы можете попробовать следующее:

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

преимущество в том, что, поскольку это решение более низкого уровня, оно позволит CORS (насколько это возможно) на IE 8/9 с другими фреймворками, а не только с jQuery. У меня был успех, используя его с AngularJS, а также jQuery 1.x и 2.x.


чтобы решить эту проблему, также проверьте, есть ли у вас некоторые включены .в JS в файле "Аякс" называется: Я получил ошибку отказа в доступе, включая shadowbox.js в моем ajax.в PHP


Я тестировал веб-службу CORS на своей машине dev и получал сообщение об ошибке "Доступ запрещен" только в IE. Firefox и Chrome работали нормально. Оказывается, это было вызвано моим использованием localhost в вызове ajax! Таким образом, мой URL браузера был чем-то вроде:

http://my_computer.my_domain.local/CORS_Service/test.html

и мой вызов ajax внутри теста.html был чем-то вроде:

//fails in IE 
$.ajax({
  url: "http://localhost/CORS_Service/api/Controller",
  ...
});

все работало как только я изменил ajax вызов для использования моего компьютера IP вместо localhost.

//Works in IE
$.ajax({
  url: "http://192.168.0.1/CORS_Service/api/Controller",
  ...
});

вкладка "сеть" окна инструментов IE dev также показывает запрос параметров предварительной подготовки CORS, за которым следует XMLHttpRequest GET, что именно то, что я ожидал увидеть.


обновление с начала 2015 года. xDomain-широко используемая библиотека для поддержки CORS на IE9 с ограниченным дополнительным кодированием.

https://github.com/jpillora/xdomain


попробуйте использовать jquery-transport-xdr плагин jQuery для запросов CORS в IE8 / 9.


Примечание-Примечание

Не используйте "http://www.домен.xxx" или "http://localhost/ " или "IP > > 127.0.0.1" для 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);