Node.js 的 CORS 的高度可配置、中间件兼容的实现。
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
使用 Corser 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
作为方法,以及一些标头,例如Accept
、 Accept-Language
、 Content-Language
和Content-Type
等Content-Type
有一个重要的限制:只允许application/x-www-form-urlencoded
、 multipart/form-data
和text/plain
。
通常,API 的Content-Type
为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"])
});