2010-05-17 23 views
14

tengo código AJAX donde si usted solicita una llamada AJAX al servidor remoto error en la solicitud:Cómo hacer una petición AJAX a otro servidor

function loadXMLDoc() { 
    if (window.XMLHttpRequest) { 
    // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
    else { 
    // code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
     document.getElementById("myDiv").innerHTML = xmlhttp.responseText; 
    } 
    } 

    xmlhttp.open("GET", "http://www.google.com", true); 
    xmlhttp.send(); 
} 

¿Qué puedo hacer para solucionar esto?

+1

posible duplicado de [jQuery AJAX dominio cruzado] (http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain) – John

Respuesta

16

Parece que se ha topado con el same origin policy. Debe usar una ruta relativa en lugar de su ruta absoluta http://www.google.com.

Como una posible solución alternativa, puede configurar un reverse proxy muy simple (con mod_proxy si está utilizando Apache). Esto le permitiría usar rutas relativas en su solicitud AJAX, mientras que el servidor HTTP actuaría como un proxy para cualquier ubicación "remota".

La directiva de configuración fundamental para configurar un proxy inverso en mod_proxy es ProxyPass. Lo más habitual es utilizar la siguiente manera:

ProxyPass  /web-services/  http://third-party.com/web-services/ 

En este caso, el navegador sería solicitar /web-services/service.xml pero el servidor serviría esta actuando como un proxy para http://third-party.com/web-services/service.xml.

Otra solución común sería usar JSONP.

3

Como medida de seguridad, AJAX no le permite realizar solicitudes a otros dominios. Cross Domain Ajax: a Quick Summary analiza varias formas de evitar el problema. La forma más fácil es usar su servidor como un proxy para descargar contenido remoto:

Este es uno de los enfoques más comunes. Su secuencia de comandos llama a su servidor, su servidor realiza la llamada al servidor remoto y luego devuelve el resultado al cliente. Este enfoque tiene algunas ventajas definidas: usted tiene más control sobre todo el ciclo de vida. Puede analizar los datos del servidor remoto, hacer con él lo que desee antes de devolverlo al cliente. Si algo falla en el camino, puede manejarlo a su manera. Y, por último, puede registrar todas las llamadas remotas. Con eso puedes rastrear el éxito, el fracaso y la popularidad.

0

Puede usar dynamic script loading. Aquí hay un artículo que escribí al respecto.

+5

No quiero sonar como idiota, pero su artículo es simplemente una fragmento de código de un libro. Además, no detalla que el otro extremo necesita específicamente soportar este tipo de carga de scripts y esto no funciona en todos los ámbitos. -1 –

+0

¿Qué quiere decir con que esto no funciona en todos los ámbitos? ¿Me puedes dar un escenario?Esta es la única forma de hacer solicitudes de dominio cruzado "ajax", debido a la misma política de origen ... – Dave

+0

el enlace está (del 4 de julio de 2017) roto ... –

0

Quería publicar otra variación en la respuesta principal. Traté de usar ProxyPass en mi archivo .htaccess pero seguí obteniendo errores de servicio interno. Finalmente, después de leer, descubrí que había otra forma de hacer esto con el motor de reescritura.

RewriteEngine On 
RewriteRule ^mail.php$ http://otherwebsite.com/mail.php [P,L] 

El P en [P,L] indica al sistema de reescritura que su uso mod_proxy. Esto funcionó para mí y no obtuve errores internos del servidor.

La ventaja de este enfoque es que, dado que usa el Rewrite Engine, tiene más control sobre las variables que puede necesitar para enviar dinámicamente al script.

Cuestiones relacionadas