在express js中允许多个CORS域

Aje*_*jey 8 javascript node.js cors express

如何以简化的方式在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();
        });
Run Code Online (Sandbox Code Playgroud)

当只有一个域提到时,这个工作 origin

但是如果我想拥有origin一个域数组并且我想为原始数组中的所有域允许CORS,我会有这样的东西 -

cors: {
            origin: ["www.one.com","www.two.com","www.three.com"];
        }
Run Code Online (Sandbox Code Playgroud)

但问题是下面的代码不起作用 -

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();
            });
Run Code Online (Sandbox Code Playgroud)

如何通过以下方式res.header获取一系列域名cors.origin

Joh*_*ter 14

我推荐cors-module:https://www.npmjs.org/package/cors 它为你做这种事 - 检查" 配置带动态原点的CORS " - 章节

  • @Ajey - 一个模块只是别人已经编写的代码来解决你的问题.在nodejs编程中,开源模块的大型库是一个很大的优点 - 忽略它们将是一种耻辱.如果需要,可以浏览github上的CORS模块以查看代码以查看其功能.代码是[这里](https://github.com/troygoode/node-cors/blob/master/lib/index.js). (11认同)
  • 该模块现在是express的一部分,您可以在https://expressjs.com/en/resources/middleware/cors.html#configuring-cors-w-dynamic-origin查看此答案中提到的文档 (2认同)

Ash*_*ith 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();
            });
Run Code Online (Sandbox Code Playgroud)


Abr*_*ham 9

最简单的方法

const cors = require("cors");
app.use(cors({ origin: ["http://localhost:3000", "https://origin2.com"] }));
Run Code Online (Sandbox Code Playgroud)

这将允许来自localhost:3000和的请求origin2.com


Del*_*Png 8

使用 Node,cors 中间件,请确保将 / 放在 url 之外,否则如果浏览器中的 url 显示时没有它,则 cors 可能会失败。IE

var corsOptions = {
origin: ["http://www.example.com/","http://localhost:3000"],
optionsSuccessStatus: 200 // For legacy browser support
}

app.use(cors(corsOptions));
Run Code Online (Sandbox Code Playgroud)

失败并会给我 cors 错误,因为浏览器会将 url 显示/读取为http://www.example.com,下面工作并且更具包容性,应该适用于http://www.example.com和任何东西除此之外,即http://www.example.com/http://www.example.com/blogs/1

var corsOptions = {
origin: ["http://www.example.com","http://localhost:3000"],
optionsSuccessStatus: 200 // For legacy browser support
}

app.use(cors(corsOptions)); 
Run Code Online (Sandbox Code Playgroud)


小智 5

实际上,只要您希望允许,Access-Control-Allow-Origin 标头应该与 Origin 标头的值相同。

所以基于你的代码

cors: {
    origin: ["www.one.com","www.two.com","www.three.com"]
}



app.all('*', function(req, res, next) {
            let origin = req.headers.origin;
            if(cors.origin.indexOf(origin) >= 0){
                res.header("Access-Control-Allow-Origin", origin);
            }         
            res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            next();
        });
Run Code Online (Sandbox Code Playgroud)