在express js中允许多个CORS域

时间:2014-11-18 06:34:32

标签: javascript node.js express cors

如何以简化的方式在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获取一系列域名?

5 个答案:

答案 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