Hier sind zwei Seiten, test.php und testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Nun mein Problem: Wenn sich beide Dateien auf demselben Server befinden (entweder localhost oder Webserver), funktioniert es und alert("Success")
wird aufgerufen. Wenn es sich auf verschiedenen Servern befindet, dh testserver.php auf dem Webserver und test.php auf localhost, funktioniert es nicht und alert("Error")
wird ausgeführt. Auch wenn die URL in Ajax in http://domain.com/path/to/file/testserver.php geändert wird
javascript
jquery
ajax
json
cross-domain
Firose Hussain
quelle
quelle
Antworten:
Verwenden Sie JSONP .
jQuery:
PHP:
Das Echo könnte falsch sein, es ist schon eine Weile her, seit ich PHP verwendet habe. In jedem Fall müssen Sie
callbackName('jsonString')
die Anführungszeichen beachten. jQuery übergibt seinen eigenen Rückrufnamen, daher müssen Sie diesen von den GET-Parametern abrufen.Und wie Stefan Kendall gepostet hat, ist $ .getJSON () eine Kurzmethode , aber dann müssen Sie
'callback=?'
die URL als GET-Parameter anhängen (ja, Wert ist ?, JQuery ersetzt dies durch eine eigene generierte Rückrufmethode).quelle
callbackName('/* json */')
statt zurückkehrencallbackName(/* json */)
?JSONP ist eine gute Option, aber es gibt einen einfacheren Weg. Sie können den
Access-Control-Allow-Origin
Header einfach auf Ihrem Server festlegen . Wenn Sie diese Option festlegen,*
werden domänenübergreifende AJAX-Anforderungen von jeder Domäne akzeptiert. ( https://developer.mozilla.org/en/http_access_control )Die Methode dazu variiert natürlich von Sprache zu Sprache. Hier ist es in Rails:
In diesem Beispiel
say_hello
akzeptiert die Aktion AJAX-Anforderungen von jeder Domain und gibt die Antwort "Hallo!" Zurück.Hier ist ein Beispiel für die Header, die möglicherweise zurückgegeben werden:
So einfach es ist, es gibt einige Browser-Einschränkungen. Siehe http://caniuse.com/#feat=cors .
quelle
.post()
Methode von jQuery verwenden, müssen Sie die domänenübergreifende Unterstützung in jQuery aktivieren. Damit ist fertig :$.support.cors = true
.Sie können dies über den HTTP-Header steuern, indem Sie Access-Control-Allow-Origin hinzufügen . Wenn Sie * festlegen, werden domänenübergreifende AJAX-Anforderungen von jeder Domäne akzeptiert.
Mit PHP ist es ganz einfach: Fügen Sie einfach die folgende Zeile in das Skript ein, auf das Sie außerhalb Ihrer Domain zugreifen möchten:
Vergessen Sie nicht, das Modul mod_headers in httpd.conf zu aktivieren.
quelle
Sie müssen sich die Same Origin Policy ansehen :
Damit Sie Daten abrufen können, müssen folgende sein:
Gleiches Protokoll und Host
Sie müssen JSONP implementieren, um dies zu umgehen.
quelle
Ich musste die Webseite von der lokalen Festplatte "file: /// C: /test/htmlpage.html" laden, die URL "http: //localhost/getxml.php" aufrufen und dies in den Browsern IE8 + und Firefox12 + tun. Verwenden Sie jQuery v1 .7.2 lib zur Minimierung des Boilerplate-Codes. Nachdem ich Dutzende von Artikeln gelesen hatte, fand ich es endlich heraus. Hier ist meine Zusammenfassung.
Hier ist ein Beispiel für einen jQuery-Ajax-Aufruf mit einigen Debug-Sysouts.
quelle
header("Access-Control-Allow-Origin: *");
Es ist richtig, dass die Richtlinie mit demselben Ursprung verhindert, dass JavaScript domänenübergreifende Anforderungen stellt. Die CORS-Spezifikation ermöglicht jedoch genau die Art von API-Zugriff, nach der Sie suchen, und wird von den aktuellen Hauptbrowsern unterstützt.
Informationen zum Aktivieren der gemeinsamen Nutzung von Ressourcen zwischen verschiedenen Ursprüngen für Client und Server:
http://enable-cors.org/
"Cross-Origin Resource Sharing (CORS) ist eine Spezifikation, die einen wirklich offenen Zugriff über Domänengrenzen hinweg ermöglicht. Wenn Sie öffentliche Inhalte bereitstellen, sollten Sie CORS verwenden, um sie für den universellen JavaScript- / Browserzugriff zu öffnen."
quelle
Dies ist möglich, Sie müssen jedoch JSONP und nicht JSON verwenden. Stefans Link hat dich in die richtige Richtung gelenkt. Auf der jQuery AJAX-Seite finden Sie weitere Informationen zu JSONP.
Remy Sharp hat ein detailliertes Beispiel mit PHP .
quelle
Ich benutze den Apache-Server, also habe ich das Modul mod_proxy verwendet. Module aktivieren:
Dann füge hinzu:
Übergeben Sie abschließend die Proxy-URL an Ihr Skript.
quelle
Die Browsersicherheit verhindert, dass ein Ajax-Aufruf von einer in einer Domain gehosteten Seite zu einer in einer anderen Domain gehosteten Seite erfolgt. Dies wird als " Politik gleichen Ursprungs " bezeichnet.
quelle
Es gibt nur wenige Beispiele für die Verwendung von JSONP, die die Fehlerbehandlung umfassen.
Beachten Sie jedoch, dass das Fehlerereignis bei Verwendung von JSONP nicht ausgelöst wird! Siehe: http://api.jquery.com/jQuery.ajax/ oder jQuery Ajax-Anforderung mit jsonp-Fehler
quelle
Aus den Jquery-Dokumenten ( Link ):
Aufgrund von Sicherheitsbeschränkungen des Browsers unterliegen die meisten "Ajax" -Anfragen derselben Ursprungsrichtlinie. Die Anforderung kann Daten aus einer anderen Domäne, Subdomäne oder einem anderen Protokoll nicht erfolgreich abrufen.
Skript- und JSONP-Anforderungen unterliegen nicht denselben Einschränkungen für Ursprungsrichtlinien.
Ich würde also davon ausgehen, dass Sie jsonp für die Anfrage verwenden müssen. Aber ich habe es nicht selbst versucht.
quelle
Ich kenne 3 Möglichkeiten, um Ihr Problem zu lösen:
Wenn Sie Zugriff auf beide Domänen haben, können Sie zunächst den Zugriff für alle anderen Domänen zulassen, indem Sie:
header("Access-Control-Allow-Origin: *");
oder nur eine Domain durch Hinzufügen des folgenden Codes zur .htaccess-Datei:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
Sie können eine Ajax-Anfrage an eine PHP-Datei auf Ihrem Server haben und die Anfrage an eine andere Domain mit dieser PHP-Datei bearbeiten.
quelle
Für Microsoft Azure ist das etwas anders.
Azure verfügt über eine spezielle CORS-Einstellung, die festgelegt werden muss. Hinter den Kulissen ist es im Wesentlichen dasselbe, aber das einfache Setzen des Headers, den Joshuarh erwähnt, funktioniert nicht. Die Azure-Dokumentation zum Aktivieren der domänenübergreifenden Aktivierung finden Sie hier:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
Ich habe ein paar Stunden damit herumgespielt, bevor mir klar wurde, dass meine Hosting-Plattform diese spezielle Einstellung hat.
quelle
es funktioniert, alles was Sie brauchen:
PHP:
JS (jQuery Ajax):
quelle