Ich habe einen Computer auf meinem lokalen LAN (machineA) mit zwei Webservern. Die erste ist die in XBMC (auf Port 8080) integrierte und zeigt unsere Bibliothek an. Der zweite Server ist ein CherryPy-Python-Skript (Port 8081), mit dem ich bei Bedarf eine Dateikonvertierung auslöse. Die Dateikonvertierung wird durch eine AJAX POST-Anforderung von der vom XBMC-Server bereitgestellten Seite ausgelöst.
- Gehe zu http: // machineA: 8080 welche zeigt Bibliothek
- Bibliothek wird angezeigt
- Der Benutzer klickt auf den Link 'Konvertieren', der den folgenden Befehl ausgibt:
jQuery Ajax-Anfrage
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- Der Browser gibt eine HTTP OPTIONS-Anforderung mit den folgenden Headern aus.
Request Header - OPTIONEN
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
- Der Server antwortet wie folgt:
Antwortheader - OPTIONEN (STATUS = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
- Das Gespräch wird dann beendet. Der Browser sollte theoretisch eine POST-Anfrage ausgeben, da der Server mit den richtigen (?) CORS-Headern geantwortet hat (Access-Control-Allow-Origin: *).
Zur Fehlerbehebung habe ich auch den gleichen Befehl $ .post von http://jquery.com ausgegeben . Hier bin ich ratlos, von jquery.com aus funktioniert die Post-Anfrage, eine OPTIONS-Anfrage wird gefolgt von einem POST gesendet. Die Header dieser Transaktion sind unten aufgeführt.
Request Header - OPTIONEN
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://jquery.com
Access-Control-Request-Method: POST
Antwortheader - OPTIONEN (STATUS = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
Request Header - POST
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache
Antwortheader - POST (STATUS = 200 OK)
Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json
Ich kann nicht herausfinden, warum dieselbe Anfrage von einer Site aus funktioniert, aber nicht von der anderen. Ich hoffe, dass jemand darauf hinweisen kann, was mir fehlt. Danke für Ihre Hilfe!
Antworten:
Ich bin schließlich auf diesen Link gestoßen: " Eine CORS POST-Anfrage funktioniert mit einfachem Javascript, aber warum nicht mit jQuery? ", Der feststellt, dass jQuery 1.5.1 das hinzufügt
Header zu allen CORS-Anfragen. jQuery 1.5.2 macht das nicht. Entsprechend der gleichen Frage wird auch ein Server-Antwortheader von festgelegt
lässt nicht zu, dass die Antwort fortgesetzt wird. Sie müssen sicherstellen, dass der Antwortheader speziell die erforderlichen Header enthält. dh:
quelle
ANFRAGE:
ANTWORT:
quelle
Ich habe mein eigenes Problem bei der Verwendung der Google Distance Matrix API gelöst, indem ich meinen Anforderungsheader mit Jquery Ajax festgelegt habe. Schauen Sie unten.
Beachten Sie, was ich bei den Einstellungen hinzugefügt habe
**
**
Ich hoffe das hilft.
quelle
Ich habe einige Zeit gebraucht, um die Lösung zu finden.
Wenn Ihre Server - Antwort korrekt , und die Anforderung ist das Problem, sollen Sie hinzufügen ,
withCredentials: true
auf denxhrFields
in der Anfrage:quelle
withCredentials: true
? Sind Sie sicher, dass Sie die entsprechenden Überschriften haben?,
jquery version: 3.2.1`. In der Tat arbeitet es durch Postboten, aber es geht nicht durch Chrome-BrowserNun, ich hatte ein paar Wochen mit diesem Problem zu kämpfen.
Der einfachste, konformste und nicht hackigste Weg, dies zu tun, ist wahrscheinlich die Verwendung einer Anbieter-JavaScript-API, die keine browserbasierten Aufrufe ausführt und Cross Origin-Anfragen verarbeiten kann.
ZB Facebook JavaScript API und Google JS API.
Falls Ihr API-Anbieter nicht aktuell ist und den Cross Origin Resource Origin-Header '*' in seiner Antwort nicht unterstützt und keine JS-API hat (Ja, ich spreche von Ihnen, Yahoo), stehen Ihnen drei Optionen zur Verfügung:
Verwenden Sie jsonp in Ihren Anfragen, um Ihrer URL eine Rückruffunktion hinzuzufügen, mit der Sie Ihre Antwort bearbeiten können. Vorsichtsmaßnahme: Dadurch wird die Anforderungs-URL geändert, sodass Ihr API-Server für die Verarbeitung von? Callback = am Ende der URL ausgestattet sein muss.
Senden Sie die Anforderung an Ihren API-Server, der von Ihnen gesteuert wird und sich entweder in derselben Domäne wie der Client befindet oder für den die Cross Origin-Ressourcenfreigabe aktiviert ist, von wo aus Sie die Anforderung an den API-Server eines Drittanbieters weiterleiten können.
Wahrscheinlich am nützlichsten in Fällen, in denen Sie OAuth-Anfragen stellen und Benutzerinteraktionen durchführen müssen Haha!
window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')
quelle
Die Verwendung in Kombination mit Laravel löste mein Problem. Fügen Sie diesen Header einfach zu Ihrer JQuery-Anfrage hinzu
Access-Control-Request-Headers: x-requested-with
und stellen Sie sicher, dass für Ihre serverseitige Antwort dieser Header festgelegt istAccess-Control-Allow-Headers: *
.quelle
Access-Control-Allow-Headers
und einem JQ zu antworten, der korrekt istAccess-Control-Request-Headers
(plus alle, die Sie per Code hinzufügen), von denen keiner Platzhalter sein kann. Es ist nur ein "schlechter" HeaderIf-None-Match
erforderlich, um den Vorflug in die Luft zu jagen, z. B. für ein bedingtes GET, wenn auf dem Server dieser nicht aufgeführt ist.Aus irgendeinem Grund wurde eine Frage zu GET-Anfragen mit dieser zusammengeführt, daher werde ich hier darauf antworten.
Diese einfache Funktion erhält asynchron eine HTTP-Statusantwort von einer CORS-fähigen Seite. Wenn Sie es ausführen, werden Sie feststellen, dass nur eine Seite mit den richtigen Kopfzeilen einen 200-Status zurückgibt, wenn über XMLHttpRequest zugegriffen wird - unabhängig davon, ob GET oder POST verwendet wird. Auf der Clientseite kann nichts unternommen werden, um dies zu umgehen, außer möglicherweise JSONP, wenn Sie nur ein JSON-Objekt benötigen.
Folgendes kann leicht geändert werden, um die im xmlHttpRequestObject-Objekt enthaltenen Daten abzurufen:
quelle
Ich hatte genau das gleiche Problem, bei dem jquery ajax mir nur Cors-Probleme bei Post-Anfragen gab, bei denen Anfragen gut funktionierten - ich habe alles oben müde gemacht, ohne Ergebnisse. Ich hatte die richtigen Header auf meinem Server usw. Die Umstellung auf XMLHTTPRequest anstelle von jquery hat mein Problem sofort behoben. Egal welche Version von jquery ich verwendet habe, es wurde nicht behoben. Fetch funktioniert auch ohne Probleme, wenn Sie keine Abwärtsbrowser-Kompatibilität benötigen.
Hoffentlich hilft dies allen anderen bei den gleichen Problemen.
quelle
Dies ist eine Zusammenfassung dessen, was für mich funktioniert hat:
Definieren Sie eine neue Funktion (
$.ajax
zur Vereinfachung umbrochen ):Verwendung:
Funktioniert auch mit
.done
,.fail
etc:Legen Sie auf der Serverseite (in diesem Fall, wo example.com gehostet wird) diese Header fest (in PHP wurde ein Beispielcode hinzugefügt):
Dies ist der einzige Weg, den ich kenne, um wirklich domänenübergreifend von JS zu POSTEN.
JSONP konvertiert den POST in GET, das möglicherweise vertrauliche Informationen in Serverprotokollen anzeigt.
quelle
Wenn Sie beim Versuch, Header hinzuzufügen oder Steuerungsrichtlinien festzulegen, aus bestimmten Gründen immer noch nicht weiter kommen, können Sie Apache ProxyPass verwenden.
Fügen Sie beispielsweise in einer
<VirtualHost>
SSL-Datei die beiden folgenden Anweisungen hinzu:Stellen Sie sicher, dass die folgenden Apache-Module geladen sind (laden Sie sie mit a2enmod):
Natürlich müssen Sie die URL Ihrer AJAX-Anforderungen ändern, um den Apache-Proxy verwenden zu können.
quelle
Dies ist ein wenig spät für die Party, aber ich habe seit ein paar Tagen damit zu kämpfen. Es ist möglich und keine der Antworten, die ich hier gefunden habe, hat funktioniert. Es ist täuschend einfach. Hier ist der .ajax-Aufruf:
Hier ist das PHP auf der Serverseite:
quelle
$.ajax()
einen korrekt konfigurierten Server aufrufen . DasAccess-Control-Request-Headers
Schwierigste ist, das Richtige zu finden, aber selbst das ist nicht allzu schwierig. Wie bereits in früheren Postern erwähnt, darf dies kein Platzhalter sein, sondern eine Whitelist mit Kopfzeilen.