Acceso denegado en IE 10 y 11 cuando el objective ajax es localhost

Estoy tratando de hacer una llamada ajax entre un servidor (http) que está en internet. Y apuntar eso a mi propio localhost. FF / Chrome / ETC … funciona. SÓLO es un problema de IE. IM UTILIZANDO IE 11 Y 10.

La solicitud es ni siquiera hecho. El “acceso denegado” se lanza al instante.

Este es el código. Solo para que lo veas.

No es el error HTTP / HTTPS clásico en IE8 E IE9. Esto es otra cosa, pero la documentación no es útil.

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

El estado es 0 en el objeto xhr y el error es “Acceso denegado”

Internet Explorer plantea este error como parte de su característica de zonas de seguridad. Al usar la configuración de seguridad predeterminada, se genera un error de “Acceso denegado” al intentar acceder a un recurso en la zona “Intranet local” desde un origen en la zona “Internet”.

Si estuviera escribiendo su código Ajax manualmente, Internet Explorer generaría un error cuando intente abrir el recurso. Por ejemplo:

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

Puede evitar este error agregando el sitio de origen a la zona de seguridad “Sitios de confianza”. Puede probar esto agregando “http://client.cors-api.appspot.com” a su zona de “Sitios de confianza” y utilizando esta página de prueba en test-cors.org con su sitio localhost como la URL remota.

Además del requisito de sitio de confianza, encontré que el problema no se solucionó hasta que usé el mismo protocolo para la solicitud que mi origen , por ejemplo, mi sitio de prueba se alojó en un https pero falló con cualquier destino usando http (sin la s).

Esto solo se aplica a IE, Chrome simplemente registra educadamente una advertencia en la consola de depuración y no falla.

Si intenta realizar solicitudes de ajax de origen cruzado en IE9, deberá usar XDomainRequest lugar de XMLHttpRequest . Hay un complemento de jQuery que envuelve XDR. Debe tener en cuenta que hay algunas limitaciones notables de XDR.

Otra opción sería usar una biblioteca como esta: https://github.com/jpillora/xdomain .

jQuery implementa llamadas ajax utilizando el objeto XMLHttpRequest que no es compatible con IE9. Tienes que forzarlo a usar XDomainRequest en XDomainRequest lugar.

Soluciono este problema usando este plugin jQuery:

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

Nota:

No use ” http://www.domain.xxx ” o ” http: // localhost / ” o “IP” para URL en Ajax. Solo use la ruta (directorio) y el nombre de la página sin dirección.

estado falso

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

verdadero estado:

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