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}`);
}); |
但是,这似乎没有任何效果,因为我可以从任何域进行GET和POST。 然后,我尝试使用以下方法将所有路由限制为一个单一来源,但结果却相同:
1
| app.use(cors({origin: 'http://example.com'})); |
我在本地主机上的开发环境和Heroku上的生产环境中都遇到了这种情况。 知道我缺少什么吗?
-
stackoverflow.com/questions/11001817/允许访问控制应设置为我想从中接受请求的站点
-
例如,@ Rico我应该怎么做才能只允许POST请求来自某个域?
-
res.header(访问控制允许方法,GET,PUT,POST,DELETE,OPTIONS); <<仅在此处保留帖子
-
仍然允许任何来源进行POST。我不怎么关心方法
-
res.header(Access-Control-Allow-Origin,http:/ricoGotSwag.com); res.header(Access-Control-Allow-Methods,POST); <<应该只允许来自ricoGotSwag.com的发布请求<<如果我使用2,则我在URL cos中使用了一个/,然后将其转换为链接
-
developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers <<所有有关HTTP标头的信息
-
嗯,我也尝试过,那应该和使用这个快速CORS包做同样的事情
-
看到这个答案(并与上面的答案进行比较):stackoverflow.com/a/21622564/1179207
-
服务器在响应中发送什么Access-Control-Allow-Origin值?要进行测试,您可以使用Postman或curl来模拟浏览器,以发送带有您要测试的任何值的Origin标头:curl -i -H"Origin: https:some-not-allowed-origin" https:your-express-site
-
因此在接受的答案中,他们说要移动app.use(cors({origin:example.com}));置顶方法
-
@sideshowbarker chrome中的开发工具不允许查看在"网络"标签下发送的记录的标题吗?
-
@sideshowbarker使用该curl命令(以及Postman)返回Access-Control-Allow-Origin→example.com,但是该请求仍返回成功的200代码,并且我的服务器对其进行了处理
-
@Rico是的,当我按照问题中的描述使用app.use(cors({...})时,它位于顶部
-
好的,尝试此代码,我将其发布在答案中以使其看起来更漂亮
如果您的服务器正在发送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代码访问响应。
-
啊,好吧,我知道我感到困惑了。 那么我的服务器是否有建议的方法来检查请求的来源并据此采取相应措施?
-
var ref = req.headers.referer; //req.headers.origin; if(ref == something){这样做} else {这样做}
-
该问题的答案取决于您"相应采取行动"的含义,但是无论如何,您似乎希望将其作为与该问题不同的问题单独发布。 似乎您对这里发布的特定问题有一个答案-我的意思是,就您为什么看到自己所看到的行为以及您的明确CORS配置是否按预期(按预期)正常工作或 如果您在配置中犯了一些错误(您没有),或者它以某种方式损坏了(不是)。