如何以简化的方式在Express中允许CORS的多个域。
我有
cors: {
origin: "www.one.com";
}
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", cors.origin);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
当origin
但是,如果我想将origin
作为一个域数组,并且我想为原始数组中的所有域允许CORS,我会有类似的东西 -
cors: {
origin: ["www.one.com","www.two.com","www.three.com"];
}
但问题是下面的代码无效 -
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", cors.origin);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
如何res.header
通过cors.origin
获取一系列域名?
答案 0 :(得分:14)
让我们了解这个标头是如何工作的。 “Access-Control-Allow-Origin”仅接受字符串。 因此,要使其动态化,您需要从http标头获取请求主机。根据您的授权域阵列进行检查。如果它存在,则将其作为值添加到标题中,否则添加默认值将禁止未经授权的域访问API。
没有本机实现。您可以使用下面的代码自己完成。
cors: {
origin: ["www.one.com","www.two.com","www.three.com"],
default: "www.one.com"
}
app.all('*', function(req, res, next) {
var origin = cors.origin.indexOf(req.header('host').toLowerCase()) > -1 ? req.headers.origin : cors.default;
res.header("Access-Control-Allow-Origin", origin);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
答案 1 :(得分:11)
我会推荐cors-module:https://www.npmjs.org/package/cors 它为你做这种事 - 检查" Configuring CORS w/ Dynamic Origin" -Section
答案 2 :(得分:7)
使用 Node 和 cors 中间件,请确保将 / 放在 url 之外,否则如果浏览器中的 url 在没有它的情况下显示,则 cors 可能会失败。即
var corsOptions = {
origin: ["http://www.example.com/","http://localhost:3000"],
optionsSuccessStatus: 200 // For legacy browser support
}
app.use(cors(corsOptions));
失败并给我 cors 错误,因为浏览器会将 url 显示/读取为 http://www.example.com,下面的工作并且更具包容性,应该适用于 http://www.example.com 以及除此之外的任何内容,即 { {3}} 或 http://www.example.com/ 等
var corsOptions = {
origin: ["http://www.example.com","http://localhost:3000"],
optionsSuccessStatus: 200 // For legacy browser support
}
app.use(cors(corsOptions));
答案 3 :(得分:3)
实际上,只要您想允许,Access-Control-Allow-Origin标头应与Origin标头的值相同。
所以基于你的代码
{{1}}
答案 4 :(得分:0)
嗨,我想分享我的解决方案:!!! 如果您正在使用远程服务器并在localhost(Webpack或其他开发环境)上进行开发,那么这些代码将起作用!
Zip