wake-up-neo.com

Zugriff in IE 10 und 11 verweigert, wenn Ajax-Ziel localhost ist

Ich versuche, einen Ajax-Anruf zwischen einem Server (http) zu tätigen, der sich im Internet befindet. Und ziele das auf meinen eigenen Localhost. FF/Chrome/ETC ... funktioniert. Es ist NUR ein IE Problem. IM USING IE 11 AND 10.

Die Anfrage ist noch nicht mal erledigt. Der "verweigerte Zugriff" wird sofort ausgelöst.

Das ist der Code. Nur damit du es siehst.

Ist nicht der klassische HTTP/HTTPS-Fehler in IE8 UND IE9. Dies ist etwas anderes, aber die Dokumentation ist nicht hilfreich.

$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) {}

Der Status ist 0 in xhr Objekt und Fehler ist "Zugriff verweigert"

37
narc88

Internet Explorer löst diesen Fehler als Teil seiner Sicherheitszonenfunktion aus. Bei Verwendung der Standardsicherheitseinstellungen wird ein Fehler "Zugriff verweigert" ausgegeben, wenn versucht wird, von einem Ursprung in der Zone "Internet" auf eine Ressource in der Zone "Lokales Intranet" zuzugreifen.

Wenn Sie Ihren Ajax-Code manuell schreiben, gibt Internet Explorer beim Versuch, die Ressource zu öffnen, einen Fehler aus. Beispielsweise:

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

Sie können diesen Fehler umgehen, indem Sie die Origin-Site der Sicherheitszone "Vertrauenswürdige Sites" hinzufügen. Sie können dies testen, indem Sie "http://client.cors-api.appspot.com" zu Ihrer Zone "Vertrauenswürdige Sites" hinzufügen und diese Testseite unter test-cors.org mit Ihrer localhost-Site verwenden als Remote-URL.

44
oobug

Zusätzlich zu den Anforderungen für vertrauenswürdige Sites stellte ich fest, dass das Problem erst behoben wurde, nachdem ich dasselbe Protokoll für die Anforderung wie mein Origin verwendet habe, z. Meine Testsite wurde auf einer https-Website gehostet, konnte jedoch mit keinem Ziel über http (ohne s) verwendet werden.

Dies gilt nur für den IE. Chrome protokolliert höflich eine Warnung in der Debug-Konsole und schlägt nicht fehl.

17

Wenn Sie versuchen, in IE9 ursprungsübergreifende Ajax-Anforderungen zu stellen, müssen Sie XDomainRequest anstelle von XMLHttpRequest verwenden. Es gibt ein jQuery-Plug-In, das XDR umschließt. Sie sollten sich bewusst sein, dass XDR einige bemerkenswerte Einschränkungen aufweist.

Eine andere Möglichkeit wäre, eine Bibliothek wie diese zu verwenden: https://github.com/jpillora/xdomain .

3
Ray Nicholus

jQuery implementiert Ajax-Aufrufe mit dem Objekt XMLHttpRequest, das in IE9 nicht unterstützt wird. Sie müssen ihn zwingen, stattdessen XDomainRequest zu verwenden.

Mit diesem jQuery-Plugin kann ich dieses Problem umgehen:

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

2
Jamie Holdstock