Eine hochgradig konfigurierbare, Middleware-kompatible Implementierung von CORS für Node.js.
Access-Control-Request-Headers
sendet.OPTIONS
Anfragen erforderlich ist, aktivieren Sie die Option endPreflightRequests
.(err, matches)
statt nur (matches)
. Ein funktionierendes Beispiel finden Sie example/express/
.
var express, corser, app;
express = require("express");
corser = require("corser");
app = express();
app.use(corser.create());
app.get("/", function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
Ein funktionierendes Beispiel finden Sie example/connect/
.
var connect, corser, app;
connect = require("connect");
corser = require("corser");
app = connect();
app.use(corser.create());
app.use(function (req, res) {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
app.listen(1337);
http
var http, corser, corserRequestListener;
http = require("http");
corser = require("corser");
// Create Corser request listener.
corserRequestListener = corser.create();
http.createServer(function (req, res) {
// Route req and res through the request listener.
corserRequestListener(req, res, function () {
res.writeHead(200);
res.end("Nice weather today, huh?");
});
}).listen(1337);
Das Erstellen eines Corser-Anfrage-Listeners, der die entsprechenden Antwortheader generiert, um CORS zu aktivieren, ist so einfach wie:
corser.create()
Dies entspricht dem Festlegen eines Antwortheaders von Access-Control-Allow-Origin: *
. Wenn Sie die Ursprünge einschränken oder komplexere Anforderungs- oder Antwortheader zulassen möchten, müssen Sie ein Konfigurationsobjekt an corser.create
übergeben.
Corser beendet automatisch Preflight-Anfragen für Sie. Eine Preflight-Anfrage ist eine spezielle OPTIONS
-Anfrage, die der Browser unter bestimmten Bedingungen sendet, um mit dem Server auszuhandeln, welche Methoden, Anfrage-Header und Antwort-Header für eine CORS-Anfrage zulässig sind. Wenn Sie die OPTIONS
-Methode für andere Dinge verwenden müssen, setzen Sie endPreflightRequests
einfach auf false
und beenden Sie diese Anfragen selbst:
var corserRequestListener;
corserRequestListener = corser.create({
endPreflightRequests: false
});
corserRequestListener(req, res, function () {
if (req.method === "OPTIONS") {
// End CORS preflight request.
res.writeHead(204);
res.end();
} else {
// Implement other HTTP methods.
}
});
Ein Konfigurationsobjekt mit den folgenden Eigenschaften kann an corser.create
übergeben werden.
origins
Eine Whitelist der Herkunft, bei der die Groß-/Kleinschreibung beachtet wird. Wenn die Anfrage von einem Ursprung stammt, der nicht in dieser Liste enthalten ist, wird sie von CORS nicht bearbeitet. Um alle Ursprünge zu akzeptieren (das Access-Control-Allow-Origin: *
-Verhalten), lassen Sie die Eigenschaft weg oder legen Sie sie auf ein leeres Array ( []
) fest.
Um eine dynamische Ursprungsprüfung zu ermöglichen, kann anstelle eines Arrays eine Funktion (origin, callback)
übergeben werden. origin
ist der Origin-Header, callback
ist eine Funktion (err, matches)
, wobei matches
ein boolesches Flag ist, das angibt, ob der angegebene Origin-Header übereinstimmt oder nicht.
Standard: Alle Ursprünge werden akzeptiert.
methods
Eine Whitelist von Methoden in Großbuchstaben. Wenn die Anfrage eine Methode verwendet, die nicht in dieser Liste enthalten ist, wird sie von CORS nicht verarbeitet.
Wenn Sie hier einen Wert festlegen, wird die Liste der standardmäßigen einfachen Methoden überschrieben. Um sie nicht zu verlieren, verknüpfen Sie die Methoden, die Sie hinzufügen möchten, mit corser.simpleMethods
: corser.simpleMethods.concat(["PUT", "DELETE"])
.
Standard: einfache Methoden ( GET
, HEAD
, POST
).
requestHeaders
Eine Whitelist von Anforderungsheadern, bei der die Groß-/Kleinschreibung nicht berücksichtigt wird. Wenn die Anfrage einen Anfrageheader verwendet, der nicht in dieser Liste enthalten ist, wird sie von CORS nicht verarbeitet.
Wenn Sie hier einen Wert festlegen, wird die Liste der standardmäßigen einfachen Anforderungsheader überschrieben. Um sie nicht zu verlieren, verknüpfen Sie die Anforderungsheader, die Sie hinzufügen möchten, mit corser.simpleRequestHeaders
: corser.simpleRequestHeaders.concat(["Authorization"])
.
Standard: einfache Anforderungsheader ( Accept
, Accept-Language
, Content-Language
, Content-Type
, Last-Event-ID
).
responseHeaders
Eine Whitelist mit Antwortheadern, bei der die Groß-/Kleinschreibung nicht beachtet wird. Jeder Antwortheader, der nicht in dieser Liste enthalten ist, wird vom Benutzeragenten (dem Browser) herausgefiltert.
Wenn Sie hier einen Wert festlegen, wird die Liste der standardmäßigen einfachen Antwortheader überschrieben. Um sie nicht zu verlieren, verknüpfen Sie die Antwortheader, die Sie hinzufügen möchten, mit corser.simpleResponseHeaders
: corser.simpleResponseHeaders.concat(["ETag"])
.
Standard: einfache Antwortheader ( Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
).
supportsCredentials
Ein boolescher Wert, der angibt, ob Cookie-Anmeldeinformationen als Teil einer CORS-Anfrage übertragen werden können. Derzeit können nur wenige HTML5-Elemente von dieser Einstellung profitieren.
Standard: false
.
maxAge
Eine Ganzzahl, die die maximale Zeitdauer in Sekunden angibt, die eine Preflight-Anfrage im clientseitigen Preflight-Ergebniscache aufbewahrt wird.
Standard: nicht festgelegt.
endPreflightRequests
Ein boolescher Wert, der angibt, ob CORS-Preflight-Anfragen automatisch geschlossen werden sollen.
Standard: true
.
Origin X is not allowed by Access-Control-Allow-Origin
Überprüfen Sie, ob der Origin
Header Ihrer Anfrage mit einem der in der origins
-Eigenschaft des Konfigurationsobjekts angegebenen Ursprünge übereinstimmt. Wenn Sie keine origins
Eigenschaft festgelegt haben, fahren Sie mit der nächsten Frage fort.
Wenn das nicht hilft, verwendet Ihre Anfrage möglicherweise eine nicht einfache Methode oder einen oder mehrere nicht einfache Header (siehe nächste Frage). Gemäß der Spezifikation ist der Satz einfacher Methoden GET
, HEAD
und POST
, und der Satz einfacher Anforderungsheader ist Accept
, Accept-Language
, Content-Language
, Content-Type
und Last-Event-ID
. Wenn Ihre Anfrage eine andere Methode oder einen anderen Header verwendet, müssen Sie diese explizit in der Eigenschaft methods
oder requestHeaders
des Konfigurationsobjekts auflisten.
Sie möchten Anfragen zulassen, die einen X-Requested-With
-Header verwenden. Übergeben Sie das folgende Konfigurationsobjekt an corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
Eine Standardkonfiguration funktioniert nur, wenn der Client eine „einfache“ Anfrage sendet, also GET
, HEAD
, POST
als Methode und einige Header wie Accept
, Accept-Language
, Content-Language
und Content-Type
Content-Type
gibt es eine wichtige Einschränkung: Nur application/x-www-form-urlencoded
, multipart/form-data
und text/plain
sind zulässig.
Normalerweise ist der Content-Type
einer API application/json
und dies ist standardmäßig nicht zulässig. Content-Type
muss explizit im Konfigurationsobjekt unter dem Schlüssel requestHeaders
angegeben werden:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
zurückgegeben. Ihr Browser blockiert alle nicht einfachen Antwortheader, die in der Preflight-Anfrage nicht ausdrücklich zugelassen wurden. Der Satz einfacher Antwortheader ist Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
und Pragma
. Wenn Sie auf andere Antwortheader zugreifen möchten, müssen Sie diese explizit in der Eigenschaft responseHeaders
des Konfigurationsobjekts auflisten.
Sie möchten Clients erlauben, den ETag
Header einer Antwort zu lesen. Übergeben Sie das folgende Konfigurationsobjekt an corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});