限制CORS源,Node / Express无法正常工作

时间:2017-03-23 01:00:13

标签: node.js express heroku http-headers cors

我正在尝试使用express.js CORS package将CORS请求的来源限制为每个路由的一个特定域,如下所示:

const express = require('express');
const cors = require('cors');

const port = process.env.PORT || 3000;

let app = express();

app.get('/', cors({origin: 'http://example.com'}), (req, res, next) => {
  res.sendStatus(200);
});

app.post('/', cors({origin: 'http://whatever.com'}) (req, res, next) => {
  res.sendStatus(200);
});

app.listen(port, () => {
  console.log(`Started on port ${port}`);
});

然而,这似乎没有任何影响,因为我可以从任何域GETPOST。然后,我尝试使用以下方法将所有路径限制为单个原点,但遇到相同的结果:

app.use(cors({origin: 'http://example.com'}));

我在localhost上的开发环境和Heroku上的生产环境中都遇到过这种情况。知道我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

如果您的服务器正在发送0 To pos响应标头,那么您实际上已经正确配置了它。

无论您发出请求的来源,服务器都会返回200响应的预期行为 - 即使是来自配置的0 To 12以外的来源的请求。

CORS设置不会导致服务器阻止来自任何客户端的请求。

相反,如果服务器使用Access-Control-Allow-Origin: http://example.com响应来自未在http://example.com运行的网络应用中的JavaScript代码的客户端请求,则浏览器会阻止该JavaScript代码从能够访问响应。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS提供了更多详细信息。

基本上它的工作方式是从服务器端,除了它发送的响应头的差异之外,没有任何行为发生变化。因此,服务器将像其他方式一样接收请求,并将发送响应,就像它本来会那样。

然后浏览器将收到响应,就像其他情况一样。您将能够在浏览器中看到响应,并在那里进行检查。但这并不意味着浏览器会将响应暴露给客户端JavaScript代码。

相反,浏览器会检查来自服务器的Access-Control-Allow-Origin: http://example.com响应标头的值,并且只有在服务器声明应该允许的情况下才会将响应交叉源公开给您的源:您的浏览器检查http://example.com针对您的实际来源,如果它完全匹配或值为Access-Control-Allow-Origin以允许任何来源,则浏览器才允许您的客户端JavaScript代码访问响应。