CORS Problem: Immer Fehler "No" Access-Control-Allow-Origin' - header vorhanden ist", als es tatsächlich ist
Ich bezweifle, dass das backend dient meine app ist wichtig, aber wenn Sie Pflege, ich bin mit rack-cors mit Rails 4.0 app.
Verwendung von jQuery, sende ich Ihnen meine app ein PATCH
Anfrage wie folgt:
$.ajax({
url: "http://example.com/whatever",
type: "PATCH",
data: { something: "something else" }
})
Wenn ich auslösen das aufrufen von Chrome, sehe ich eine erfolgreiche OPTIONS
Wunsch gehen, der gibt diese Header von meinem server:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, content-type
Access-Control-Allow-Methods:GET, PUT, PATCH, OPTIONS
Access-Control-Allow-Origin: http://sending-app.localhost:3000
Access-Control-Expose-Headers:
Access-Control-Max-Age:15
Dann sehe ich einen PATCH
Anfrage gehen, die wirft diesen Fehler:
XMLHttpRequest-Objekt kann nicht geladen werden http://example.com/whatever. Kein "Access-Control-Allow-Origin' - header vorhanden ist, auf die angeforderte Ressource. Herkunft 'http://sending-app.localhost:3000' ist daher nicht der Zugriff erlaubt.
Ich habe versucht, das Umschalten von PATCH
zu PUT
mit dem gleichen Ergebnis.
Diese macht keinen Sinn für mich. Was ist Los?
Update: Meine config/application.rb
Dachte ich, dass der Header die ganze Geschichte erzählt, aber da die Menschen verwirrt sind, hier ist meine config/application.rb
- Datei, die ist, wie die rack-cors-plugin für Rails konfiguriert ist:
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :put, :patch, :options],
:max_age => 15
end
end
- Was macht Ihr
application.rb
Aussehen? - Ich habe meine
application.rb
, für was es Wert ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auszuschließen Schienen CSRF-Prüfung an der Aktion 😉
Ist, Schienen überprüft, die für eine Authentizität token mit update/Anfragen. In Ihrem Rails-app, dieses token wird Hinzugefügt, um alle Ihre Formen. Aber mit javascript-Anfragen, darunter ist es schwierig.
Können Sie überspringen, überprüfen Sie es für eine Aktion, indem diese Ihren controller:
BTW, dein problem hat nichts zu tun mit CORS, du warst immer eine schlechte Fehlermeldung im browser angezeigt. Die Schienen-log erzählt die real Geschichte.
skip_before_action
mit Schienen 5 (und technisch mit Schienen 4 auch).Möchten Sie vielleicht fügen Sie diese zu Ihrem
config/application.rb
Datei:Den
resource
Teil ist, wo Sie festlegen können, welche Methoden /Anforderungen Ihre endpoint akzeptieren kann!Hoffe, das hilft
rack-cors
setup, dass ich in config/application.rb.rack-cors
ist das einzige Rack-middleware, die ich Hinzugefügt habe.PATCH
Endpunkt und es tut alles was ich möchte, es zu tun.patch
? Waspost
(nur als test)?Dies ist einige seltsame Sachen.
A) Als Testversion, die Sie sollten versuchen, die Eingabe in
*
als Ihr erlaubt Herkunft.B) Ist das eine whitespace-Problem? Nach der Doppelpunkte, die Sie nicht haben Räume, in einige der Optionen.
C) Das sieht aus wie ein "preflighted request" (https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS). Ein preflighted request ist einer, der nicht mit "application/x-www-form-urlencoded", die ihrige werden sollte. http://api.jquery.com/jquery.ajax/ Staaten der default content type x-www-form-urlencoded, und Sie sind nicht übergeordneten Inhaltstyp. Das heißt, es sollte nicht müssen, werden 2 Anfragen.
D) Wie oben erwähnt, CSRF könnte das Problem sein. Ich bin kein rails person. Wenn es ist auch die Frage, was können Sie tun möchten, ist fügen Sie Ihren CSRF-token zu allen ajax sendet, in etwa so:
Gibt es ein paar andere Möglichkeiten, dies zu tun. Es hängt davon ab, was Ihre frameworks/Bibliotheken müssen.
Hier ist was ich gefunden habe um das Problem zu lösen, die aus älteren SO Beiträge zum Umgang mit csrf-Probleme: