768 Stimmen

Warum erlaubt das Hinzufügen von CORS-Headern zu einer OPTIONS-Route den Browsern nicht den Zugriff auf meine API?

Ich versuche, CORS in meiner Node.js-Anwendung zu unterstützen, die das Express.js-Webframework verwendet. Ich habe gelesen eine Google-Gruppendiskussion darüber, wie dies zu handhaben ist, und lesen Sie einige Artikel über die Funktionsweise von CORS. Zunächst habe ich dies getan (der Code ist in CoffeeScript-Syntax geschrieben):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

Es scheint nicht zu funktionieren. Es scheint, dass mein Browser (Chrome) die anfängliche OPTIONS-Anfrage nicht sendet. Wenn ich gerade den Block für die Ressource aktualisiert habe, an die ich eine herkunftsübergreifende GET-Anforderung senden muss:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

Es funktioniert (in Chrome). Dies funktioniert auch in Safari.

Ich habe gelesen, dass...

In einem Browser, der CORS implementiert, wird jeder herkunftsübergreifenden GET- oder POST-Anfrage eine OPTIONS-Anfrage vorangestellt, die prüft, ob der GET oder POST OK ist.

Meine Hauptfrage ist also, wie kommt es, dass dies in meinem Fall nicht zu passieren scheint? Warum wird mein app.options-Block nicht aufgerufen? Warum muss ich die Header in meinem Haupt app.get-Block festlegen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X