关于node.js:使用Node / Express限制CORS起源不起作用

Restricting CORS origin with Node/Express not working

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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。 然后,我尝试使用以下方法将所有路由限制为一个单一来源,但结果却相同:

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

我在本地主机上的开发环境和Heroku上的生产环境中都遇到了这种情况。 知道我缺少什么吗?


如果您的服务器正在发送Access-Control-Allow-Origin: http://example.com响应标头,则实际上您已经正确配置了它。

无论您从哪个来源发出请求,服务器都会返回200响应,这是预期行为,即使来自配置的http://example.com以外的来源的请求也是如此。

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

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

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

基本上,它的工作方式是从服务器端开始,除了发送的响应头不同之外,其他任何行为都没有改变。因此,服务器将按其他方式接收请求,并按其他方式发送响应。

然后,浏览器将按照其他方式接收响应。您将能够在浏览器devtools中查看响应并在那里进行检查。但这并不意味着浏览器会将响应公开给您的客户端JavaScript代码。

而是,浏览器从服务器检查Access-Control-Allow-Origin响应标头的值,并且仅在服务器表示应允许以下情况时才将响应跨域公开到您的原始地址:您的浏览器针对Access-Control-Allow-Origin的值进行检查您的实际来源,如果它完全匹配或值为*以允许任何来源,则浏览器才允许您的客户端JavaScript代码访问响应。