这是一个关于采取策略和解决我对我的想法的疑虑的问题。
我想要的是允许 CORS 请求,即。 Access-Control-Allow-Origin 取决于我拥有的环境类型。所以这是我的 cors header :
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', 'https://siteone.com');
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, access-control-allow-origin');
next();
});
但我想要的是这样的条件逻辑:
const ACAOSite = process.env.NODE_ENV == 'production' ? 'https://siteone.com' : 'https://sitetwo.com';
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', ACAOSite);
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, access-control-allow-origin');
next();
});
不过这是好的做法吗?还有另一种方法吗?另外,我不想允许每个站点都使用 *,我想选择要允许的站点。
最佳答案
使用dotenv或配置文件来设置您允许的来源。
与从 .env(使用 dotenv)或可在服务器上修改的配置文件读取的测试/生产数据库凭据的不同配置相同。
例如,如果您的 .env 文件包含:
allowed_origins=https://siteone.com
那么你的代码应该是这样的:
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', process.env.allowed_origins);
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, access-control-allow-origin');
next();
});
您还可以使用多个来源逗号分隔,例如
allowed_origins=https://siteone.com, https://siteone-server2.com
关于javascript - Express.js 中的条件 CORS 访问控制允许来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54019064/