Легко настраиваемая, совместимая с промежуточным программным обеспечением реализация CORS для Node.js.
Access-Control-Request-Headers
.OPTIONS
, отметьте опцию endPreflightRequests
.(err, matches)
а не просто (matches)
. См. 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);
См. 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);
Создать прослушиватель запросов Corser, который генерирует соответствующие заголовки ответов для включения CORS, очень просто:
corser.create()
Это эквивалент установки заголовка ответа Access-Control-Allow-Origin: *
. Если вы хотите ограничить источники или разрешить более сложные заголовки запросов или ответов, вам необходимо передать объект конфигурации в corser.create
.
Corser автоматически завершит предполетные запросы за вас. Предварительный запрос — это специальный запрос OPTIONS
, который браузер отправляет при определенных условиях для согласования с сервером того, какие методы, заголовки запросов и заголовки ответов разрешены для запроса CORS. Если вам нужно использовать метод OPTIONS
для других целей, просто установите для endPreflightRequests
значение false
и завершите эти запросы самостоятельно:
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.
}
});
В corser.create
можно передать объект конфигурации со следующими свойствами.
origins
Белый список источников с учетом регистра. Если запрос поступает из источника, которого нет в этом списке, CORS не будет обрабатывать его. Чтобы принять все источники (поведение Access-Control-Allow-Origin: *
), опустите свойство или задайте для него пустой массив ( []
).
Чтобы обеспечить динамическую проверку происхождения, вместо массива можно передать функцию (origin, callback)
. origin
— это заголовок Origin, callback
— это функция (err, matches)
, где matches
— это логический флаг, указывающий, соответствует ли данный заголовок Origin или нет.
По умолчанию: принимаются все источники.
methods
Белый список методов в верхнем регистре. Если в запросе используется метод, которого нет в этом списке, CORS не будет обрабатывать его.
Установка значения здесь перезапишет список простых методов по умолчанию. Чтобы не потерять их, соедините методы, которые хотите добавить, с помощью corser.simpleMethods
: corser.simpleMethods.concat(["PUT", "DELETE"])
.
По умолчанию: простые методы ( GET
, HEAD
, POST
).
requestHeaders
Белый список заголовков запросов без учета регистра. Если в запросе используется заголовок запроса, которого нет в этом списке, CORS не будет обрабатывать его.
Установка значения здесь перезапишет список простых заголовков запросов по умолчанию. Чтобы не потерять их, соедините заголовки запросов, которые вы хотите добавить, с помощью corser.simpleRequestHeaders
: corser.simpleRequestHeaders.concat(["Authorization"])
.
По умолчанию: простые заголовки запроса ( Accept
, Accept-Language
, Content-Language
, Content-Type
, Last-Event-ID
).
responseHeaders
Белый список заголовков ответов без учета регистра. Любой заголовок ответа, которого нет в этом списке, будет отфильтрован пользовательским агентом (браузером).
Установка значения здесь перезапишет список заголовков простых ответов по умолчанию. Чтобы не потерять их, соедините заголовки ответов, которые вы хотите добавить, с помощью corser.simpleResponseHeaders
: corser.simpleResponseHeaders.concat(["ETag"])
.
По умолчанию: простые заголовки ответов ( Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
).
supportsCredentials
Логическое значение, указывающее, можно ли передавать учетные данные cookie как часть запроса CORS. В настоящее время только несколько элементов HTML5 могут воспользоваться этой настройкой.
По умолчанию: false
.
maxAge
Целое число, указывающее максимальное время в секундах, в течение которого предварительный запрос хранится в кэше результатов предварительной проверки на стороне клиента.
По умолчанию: не установлено.
endPreflightRequests
Логическое значение, указывающее, следует ли автоматически закрывать предварительные запросы CORS.
По умолчанию: true
.
Origin X is not allowed by Access-Control-Allow-Origin
Проверьте, соответствует ли заголовок Origin
вашего запроса одному из источников, указанных в свойстве origins
объекта конфигурации. Если вы не установили какое-либо свойство origins
, перейдите к следующему вопросу.
Если это не помогает, возможно, в вашем запросе используется сложный метод или один или несколько сложных заголовков (см. следующий вопрос). Согласно спецификации набор простых методов — GET
, HEAD
и POST
, а набор простых заголовков запроса — Accept
, Accept-Language
, Content-Language
, Content-Type
и Last-Event-ID
. Если в вашем запросе используется какой-либо другой метод или заголовок, вы должны явно указать их в methods
или свойстве requestHeaders
объекта конфигурации.
Вы хотите разрешить запросы, использующие заголовок X-Requested-With
. Передайте следующий объект конфигурации в corser.create
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["X-Requested-With"])
});
Request header field Content-Type is not allowed by Access-Control-Allow-Headers
Конфигурация по умолчанию будет работать только в том случае, если клиент отправляет «простой» запрос, т. е. метод GET
, HEAD
, POST
as и некоторые заголовки, такие как Accept
, Accept-Language
, Content-Language
, Content-Type
и т. д Content-Type
имеет важное ограничение: разрешены только application/x-www-form-urlencoded
, multipart/form-data
и text/plain
.
Обычно Content-Type
API будет application/json
, но по умолчанию это запрещено. Content-Type
необходимо явно указать в объекте конфигурации под ключом requestHeaders
:
corser.create({
requestHeaders: corser.simpleRequestHeaders.concat(["Content-Type"])
});
Refused to get unsafe header "X"
Ваш браузер блокирует все сложные заголовки ответов, которые не были явно разрешены в предполетном запросе. Набор простых заголовков ответа — Cache-Control
, Content-Language
, Content-Type
, Expires
, Last-Modified
, Pragma
. Если вы хотите получить доступ к любому другому заголовку ответа, вам необходимо явно указать их в свойстве responseHeaders
объекта конфигурации.
Вы хотите разрешить клиентам читать заголовок ETag
ответа. Передайте следующий объект конфигурации в corser.create
:
corser.create({
responseHeaders: corser.simpleResponseHeaders.concat(["ETag"])
});