限制 CORS 来源,Node/Express 不起作用

dou*_*lin 5 heroku http-headers node.js cors express

我尝试使用express.js CORS 包将 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}`);
});
Run Code Online (Sandbox Code Playgroud)

然而,这似乎没有任何效果,因为我可以GET进出POST任何域。然后,我尝试使用以下命令将所有路由限制为一个来源,但得到了相同的结果:

app.use(cors({origin: 'http://example.com'}));
Run Code Online (Sandbox Code Playgroud)

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

sid*_*ker 5

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

\n

无论您从哪个来源发出请求,\xe2\x80\x99 都是服务器返回 200 响应的预期行为,即使对于来自配置之外的来源的请求也是如此http://example.com

\n

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

\n

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

\n

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

\n

基本上它的工作方式是,从服务器端来看,除了发送的响应标头不同之外,没有任何行为改变。因此,服务器将像其他情况一样接收请求,并像其他情况一样发送响应。

\n

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

\n

相反,浏览器会检查来自服务器的响应标头的值Access-Control-Allow-Origin,并且仅当服务器表示应该允许以下情况时,才会将响应跨源公开到您的源: 您的浏览器会根据Access-Control-Allow-Origin您的实际源检查 的值,并且如果它要么完全匹配,要么该值*允许任何来源,只有这样浏览器才允许您的客户端 JavaScript 代码访问响应。

\n

  • var ref = req.headers.referer; //req.headers.origin; if(ref==something) { 做这个 } else { 做那个 } (2认同)