Probleme mit einem meiner Meinung nach relativ einfachen jQuery-Plugin zu haben ...
Das Plugin sollte Daten aus einem PHP-Skript über Ajax abrufen, um Optionen zu a hinzuzufügen <select>
. Die Ajax-Anfrage ist ziemlich allgemein:
$.ajax({
url: o.url,
type: 'post',
contentType: "application/x-www-form-urlencoded",
data: '{"method":"getStates", "program":"EXPLORE"}',
success: function (data, status) {
console.log("Success!!");
console.log(data);
console.log(status);
},
error: function (xhr, desc, err) {
console.log(xhr);
console.log("Desc: " + desc + "\nErr:" + err);
}
});
Dies scheint in Safari gut zu funktionieren. In Firefox 3.5 ist das REQUEST_TYPE
auf dem Server immer 'OPTIONS' und die $ _POST-Daten werden nicht angezeigt. Apache protokolliert die Anforderung als Typ 'OPTIONEN':
::1 - - [08/Jul/2009:11:43:27 -0500] "OPTIONS sitecodes.php HTTP/1.1" 200 46
Warum sollte dieser Ajax-Aufruf in Safari funktionieren, nicht jedoch in Firefox, und wie kann ich ihn für Firefox beheben?
Antwortheader Datum: Mi, 08. Juli 2009 21:22:17 GMT Server: Apache / 2.0.59 (Unix) PHP / 5.2.6 DAV / 2 X-Powered-By: PHP / 5.2.6 Inhaltslänge 46 Keep-Alive-Timeout = 15, max = 100 Verbindung bleibt erhalten Inhaltstyp text / html Header anfordern Host-Bestellformular: 8888 User-Agent Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv: 1.9.1) Gecko / 20090624 Firefox / 3.5 Akzeptiere Text / HTML, Anwendung / xhtml + xml, Anwendung / xml; q = 0,9, * / *; q = 0,8 Akzeptiere-Sprache en-us, en; q = 0,5 Accept-Encoding gzip, entleeren Accept-Charset ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Keep-Alive 300 Verbindung am Leben erhalten Herkunft http://ux.inetu.act.org Zugriffssteuerungs-Anforderungsmethode POST Access-Control-Request-Header x-angefordert-mit
Hier ist ein Bild der Firebug-Ausgabe:
ajax
firefox
jquery-plugins
jquery
fitzgeraldsteele
quelle
quelle
Antworten:
Der Grund für den Fehler ist dieselbe Ursprungsrichtlinie. Sie können nur XMLHTTPRequests für Ihre eigene Domain durchführen. Überprüfen Sie, ob Sie stattdessen einen JSONP- Rückruf verwenden können:
quelle
Ich habe den folgenden Code auf der Django-Seite verwendet, um die OPTIONS-Anforderung zu interpretieren und die erforderlichen Access-Control-Header festzulegen. Danach begannen meine domänenübergreifenden Anfragen von Firefox zu funktionieren. Wie bereits erwähnt, sendet der Browser zuerst die OPTIONS-Anfrage und unmittelbar danach den POST / GET
Bearbeiten: Es scheint, dass Sie zumindest in einigen Fällen auch die gleichen Access-Control-Header zur tatsächlichen Antwort hinzufügen müssen. Dies kann etwas verwirrend sein, da die Anforderung erfolgreich zu sein scheint, Firefox den Inhalt der Antwort jedoch nicht an das Javascript weiterleitet.
quelle
Access-Control-Allow-Headers
sollte den Wert enthaltenx-csrf-token
, nichtx-csrftoken
.Dieser Artikel im Mozilla Developer Center beschreibt verschiedene domänenübergreifende Anforderungsszenarien. Der Artikel scheint darauf hinzuweisen, dass eine POST-Anfrage mit dem Inhaltstyp 'application / x-www-form-urlencoded' als 'einfache Anfrage' gesendet werden sollte (ohne 'Preflight'-OPTIONS-Anfrage). Ich habe jedoch festgestellt, dass Firefox die OPTIONS-Anforderung gesendet hat, obwohl mein POST mit diesem Inhaltstyp gesendet wurde.
Ich konnte dies zum Laufen bringen, indem ich auf dem Server einen Optionsanforderungshandler erstellte, der den Antwortheader 'Access-Control-Allow-Origin' auf '*' setzte. Sie können restriktiver sein, indem Sie eine bestimmte Einstellung festlegen , z. B. " http://someurl.com ". Ich habe auch gelesen, dass Sie angeblich eine durch Kommas getrennte Liste mehrerer Ursprünge angeben können, aber ich konnte dies nicht zum Laufen bringen.
Sobald Firefox die Antwort auf die OPTIONS-Anforderung mit einem akzeptablen Wert für "Access-Control-Allow-Origin" erhält, sendet es die POST-Anforderung.
quelle
Ich habe dieses Problem mit einer vollständig auf Apache basierenden Lösung behoben. In meinem vhost / htaccess habe ich folgenden Block eingefügt:
Sie benötigen den letzten Teil möglicherweise nicht, je nachdem, was passiert, wenn Apache Ihr Zielskript ausführt. Der letzte Teil geht an die freundlichen ServerFault-Leute .
quelle
Dieses PHP oben im antwortenden Skript scheint zu funktionieren. (Mit Firefox 3.6.11. Ich habe noch nicht viele Tests durchgeführt.)
quelle
GET
,POST
, ...) ist ein bisschen zu viel nach meinem Geschmack. (Und ich frage mich, ob das Senden immer den Spezifikationen entspricht?)Ich hatte das gleiche Problem beim Senden von Anfragen an Google Maps, und die Lösung ist mit jQuery 1.5 recht einfach - für die Verwendung von Datentypen
dataType: "jsonp"
quelle
Culprit ist eine Preflight-Anfrage mit der OPTIONS-Methode
Für HTTP-Anforderungsmethoden, die Nebenwirkungen auf Benutzerdaten verursachen können (insbesondere für andere HTTP-Methoden als GET oder für die POST-Verwendung mit bestimmten MIME-Typen), schreibt die Spezifikation vor, dass Browser die Anforderung "vorfliegen" und unterstützte Methoden von der Server mit einer HTTP-OPTIONS-Anforderungsmethode und dann nach "Genehmigung" durch den Server die tatsächliche Anforderung mit der tatsächlichen HTTP-Anforderungsmethode senden.
Webspezifikationen beziehen sich auf: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Ich habe das Problem durch Hinzufügen der folgenden Zeilen in Nginx conf behoben.
quelle
Ich habe Quelle 1.3.2 durchgesehen. Bei Verwendung von JSONP wird die Anforderung durch dynamisches Erstellen eines SCRIPT-Elements gestellt, das über die Same-Domain-Richtlinie des Browsers hinausgeht. Natürlich können Sie keine POST-Anfrage mit einem SCRIPT-Element stellen, der Browser würde das Ergebnis mit GET abrufen.
Wenn Sie einen JSONP-Aufruf anfordern, wird das SCRIPT-Element nicht generiert, da dies nur erfolgt, wenn der Typ des AJAX-Aufrufs auf GET festgelegt ist.
http://dev.jquery.com/ticket/4690
quelle
Wir hatten ein solches Problem mit ASP.Net. Unser IIS hat einen internen Serverfehler zurückgegeben, als versucht wurde, eine jQuery auszuführen
$.post
, um HTML-Inhalte abzurufen, da PageHandlerFactory nurGET,HEAD,POST,DEBUG
Verben beantworten durfte . Sie können diese Einschränkung also ändern, indem Sie das Verb "OPTIONEN" zur Liste hinzufügen oder "Alle Verben" auswählen.Sie können dies in Ihrem IIS-Manager ändern, indem Sie Ihre Website auswählen und dann Handlerzuordnungen auswählen. Doppelklicken Sie in Ihrer PageHandlerFactory für * .apx-Dateien nach Bedarf (wir verwenden den integrierten Anwendungspool mit Framework 4.0). Klicken Sie auf Anforderungsbeschränkungen, gehen Sie zur Registerkarte Verben und übernehmen Sie Ihre Änderung.
Jetzt
$.post
funktioniert unsere Anfrage wie erwartet :)quelle
Überprüfen Sie, ob die
action
URL Ihres Formulars denwww
Teil der Domain enthält, während die von Ihnen geöffnete Originalseite ohne angezeigt wirdwww
.In der Regel für kanonische Urls gemacht.
Ich kämpfte stundenlang, bevor ich auf diesen Artikel stieß und den Hinweis auf Cross Domain fand.
quelle
Ich scheine, dass wenn
o.url = 'index.php'
und diese Datei existiert, in Ordnung ist und eine Erfolgsmeldung in der Konsole zurückgegeben wird. Es wird ein Fehler zurückgegeben, wenn ich url verwende:http://www.google.com
Wenn Sie eine Post-Anfrage stellen, warum nicht direkt die $ .post- Methode verwenden:
Es ist so viel einfacher.
quelle
Ich habe ein klares Beispiel für die Lösung dieses Problems veröffentlicht, wenn Sie den Servercode der Domain steuern, auf die Sie POSTEN. Diese Antwort wird in diesem Thread angesprochen, aber dies erklärt es IMO deutlicher.
Wie sende ich eine domänenübergreifende POST-Anfrage über JavaScript?
quelle
Lösung hierfür ist:
json
&callback=?
zu deiner URL hinzufügenDies funktionierte beim Aufrufen der Facebook-API und mit Firefox. Firebug wird
GET
anstelleOPTIONS
der oben genannten Bedingungen verwendet (beide).quelle
Eine andere Möglichkeit, das Problem zu umgehen, ist die Verwendung eines Proxy-Skripts. Diese Methode wird hier beispielsweise beschrieben
quelle
Kannst du das ohne versuchen
contentType:application/x-www-form-urlencoded
quelle
Versuchen Sie, die Option hinzuzufügen:
Datentyp: "json"
quelle
quelle
Ich hatte ein ähnliches Problem beim Versuch, die Facebook-API zu verwenden.
Der einzige contentType, der die Preflighted-Anfrage nicht gesendet hat, schien nur Text / Plain zu sein ... nicht die restlichen Parameter, die hier bei Mozilla erwähnt wurden
Zu Ihrer Information: Das oben erwähnte Moz-Dokument schlägt vor, dass X-Lori-Header eine Preflighted-Anfrage auslösen sollten ... das tut es nicht.
quelle
Sie müssen einige Arbeiten auf der Serverseite ausführen. Ich sehe, dass Sie PHP auf der Serverseite verwenden, aber die Lösung für .NET-Webanwendungen ist hier: Der Inhaltstyp kann in jQuery.ajax nicht auf 'application / json' gesetzt werden
Machen Sie dasselbe in PHP-Skript und es wird funktionieren. Einfach: Bei der ersten Anfrage fragt der Browser den Server, ob er solche Daten mit einem solchen Typ senden darf, und die zweite Anfrage ist die richtige / erlaubte.
quelle
Versuchen Sie Folgendes hinzuzufügen:
quelle
Ich habe eine Proxy-URL verwendet, um ein ähnliches Problem zu lösen, wenn ich Daten auf meinem Apache Solr veröffentlichen möchte, der auf einem anderen Server gehostet wird. (Dies ist möglicherweise nicht die perfekte Antwort, löst aber mein Problem.)
Folgen Sie dieser URL: Mit Mode-Rewrite zum Proxying füge ich diese Zeile meiner httpd.conf hinzu:
Daher kann ich nur Daten an / solr senden, anstatt Daten an http: // ip: 8983 / solr / * zu senden . Dann werden Daten im selben Ursprung gebucht.
quelle
Ich habe bereits diesen Code, der meine Cors-Situation in PHP gut handhabt:
Und es funktionierte lokal und remote einwandfrei, aber nicht für Uploads im Remote-Modus.
Es passiert etwas mit Apache / PHP ODER meinem Code. Ich habe mich nicht darum gekümmert, ihn zu durchsuchen. Wenn Sie OPTIONEN anfordern, wird mein Header mit Cors-Regeln zurückgegeben, aber mit einem Ergebnis von 302. Daher erkennt mein Browser keine akzeptable Situation.
Was ich getan habe, basierend auf der Antwort von @Mark McDonald, ist einfach diesen Code nach meinem Header zu setzen:
Wenn
OPTIONS
Sie jetzt eine Anfrage stellen , werden nur der Header und das Ergebnis 202 gesendet.quelle
Bitte beachten Sie:
JSONP unterstützt nur die GET-Anforderungsmethode.
* Anfrage per Firefox senden : *
Oben Anfrage per OPTIONS senden (während ==> Typ: 'POST' ) !!!!
Aber obige Anfrage per GET senden (while ==> Typ: 'POST' ) !!!!
Wenn Sie sich in der "domänenübergreifenden Kommunikation" befinden, achten Sie darauf und seien Sie vorsichtig.
quelle