2009-11-19 3 views
10

Ich habe Website, die XMLHttpRequest (jQuery, eigentlich) verwenden. Ich habe auch eine andere Seite, die auf dem gleichen Server läuft, der eine Skriptdatei bedient, die XHR-Anfragen zurück zu DIESER Seite macht, dh.Kann ich XMLHttpRequest an einem anderen Port als eine von diesem Port geladene Skriptdatei verwenden?

http://mysite:50000/index.html umfasst

<script src="http://mysite:9000/otherscript.js"></script> 

und http://mysite:9000/otherscript.js umfasst

$.ajax({ 
    url: 'http://mysite:9000/ajax/stuff' 
}); 

Das Problem ist - das funktioniert nicht. Die AJAX-Anfragen aus dem geladenen Skript scheitern einfach ohne Fehlermeldung. Nach dem, was ich gefunden habe, ist dies die alte selbe Herkunftspolitik. In Anbetracht dessen, dass ich beide Websites kontrolliere, kann ich irgendetwas dafür tun, dass dies funktioniert? Der Trick "document.domain" scheint nichts für XMLHttpRequest zu tun.

Antwort

10

Nein - kann dies nicht mit XHR tun. Die Same-Domain-Richtlinie ist sehr restriktiv - gleicher Host, gleicher Port, dasselbe Protokoll. Es tut uns leid! Sie müssen zu anderen Tricks (iframes, Titelmanipulation, usw.) greifen, um es zum Funktionieren zu bringen.

+0

Was ist der "Titel Manipulation" Trick? – EMP

+0

Wenn Sie JavaScript signiert haben, können Sie dies auf FF tun. – bmargulies

+2

Siehe http://dannythorpe.com/2008/07/28/cross-domain-transport-with-windowname/ und http://orensol.com/2009/06/07/cross-domain-ajax-calls-and -iframe-communication-how-to/für Beispiele. Es gibt jQuery und Dojo Addons, die dieses Zeug schön verpacken. – nitzmahone

10

können Sie dies tun, indem Sie Access-Control-Allow-Origin Header hinzufügen. Wenn Sie mich

0

gerade ein ähnliches Problem mit einem PHP gelöst ich verwenden arbeitet für u php

header("Access-Control-Allow-Origin: http://example.com"); 

oder in node.js

response.writeHead(200,{'Access-Controll-Allow-Origin':' http://example.com'}); 

dies den Trick muss es immer Service Ich spiele gerade mit (nicht sicher, wie relevant eine PHP-Lösung ist, um direkt, aber ...), indem Sie eine einzige Zeile Proxy-PHP-Seite, SimpleProxy.php:

<?php 
echo file_get_contents('http://localhost:4567'); 
?> 

Und in meinem XMLHttpRequest verwende ich "SimpleProxy.php" anstelle von "http://localhost:4567", die die Anfrage effektiv auf die gleiche Domäne wie meine .js-Code setzt.