web-dev-qa-db-fra.com

Accès refusé dans IE 10 et 11 lorsque la cible ajax est localhost

J'essaie de faire un appel ajax entre un serveur (http) qui est sur Internet. Et ciblez cela à mon propre localhost. FF/Chrome/ETC ... fonctionne. C’est UNIQUEMENT un IE numéro. IM USING IE 11 ET 10.

La demande est même pas faite. "L'accès refusé" est lancé instantanément.

Ceci est le code. Juste à vous de voir.

N'est-ce pas l'erreur classique HTTP/HTTPS dans IE8 ET IE9. C'est autre chose, mais la documentation n'est pas utile.

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

Le statut est 0 dans xhr objet et erreur correspond à "Accès refusé"

37
narc88

Internet Explorer génère cette erreur dans le cadre de sa fonctionnalité de zones de sécurité. En utilisant les paramètres de sécurité par défaut, une erreur "Accès refusé" est générée lors de la tentative d'accès à une ressource de la zone "Intranet local" à partir d'une origine dans la zone "Internet".

Si vous écriviez votre code Ajax manuellement, Internet Explorer générerait une erreur lorsque vous essayez d'ouvrir la ressource. Par exemple:

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

Vous pouvez contourner cette erreur en ajoutant le site d'origine à la zone de sécurité "Sites de confiance". Vous pouvez le tester en ajoutant "http://client.cors-api.appspot.com" à votre zone "Sites de confiance" et en utilisant cette page de test à l'adresse test-cors.org avec votre site localhost. en tant qu'URL distante.

44
oobug

En plus de l'exigence relative au site de confiance, j'ai constaté que le problème n'était résolu que lorsque I tilise le même protocole pour la demande que mon origine, par exemple. mon site de test a été hébergé sur un https mais a échoué avec toute destination utilisant http (sans le s).

Ceci ne s'applique qu'à IE Chrome enregistre poliment un avertissement dans la console de débogage et n'échoue pas.

17
Martin Laukkanen

Si vous essayez de faire des requêtes ajax cross-Origin dans IE9, vous devrez utiliser XDomainRequest au lieu de XMLHttpRequest. Il existe un plug-in jQuery qui enveloppe XDR. Vous devez savoir qu'il existe certaines limitations notables de XDR.

Une autre option serait d’utiliser une bibliothèque comme celle-ci: https://github.com/jpillora/xdomain .

3
Ray Nicholus

jQuery implémente les appels ajax à l'aide de l'objet XMLHttpRequest qui n'est pas pris en charge dans IE9. Vous devez le forcer à utiliser XDomainRequest à la place.

Je contourne ce problème en utilisant ce plugin jQuery:

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

2
Jamie Holdstock