Access-Control-Allow-Headers 设置后还是报错,到底该怎么配?

梦幻🍀 阅读 12

我在前端用 fetch 发请求时加了自定义 header,比如 X-Requested-With,但浏览器一直报 CORS 错误,说这个 header 不被允许。我后端是用 Node.js + Express 写的,已经在响应头里加了 Access-Control-Allow-Headers: X-Requested-With,可问题还在。

是不是还要加别的?比如默认的那些 Content-Type、Authorization 之类的?我试过写成 Access-Control-Allow-Headers: *,但好像对非简单请求没用。现在卡在这儿了,不知道到底该怎么正确配置。

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With');
  next();
});
我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
南宫西西
你这问题我也踩过,确实挺烦人。Access-Control-Allow-Headers 设置成 * 对非简单请求不起作用确实是这么回事,浏览器就是这么设计的。

首先你得把常用的那些 header 都加上,别光写 X-Requested-With 一个。Content-Type 和 Authorization 确实应该加进去,我一般还会把 Accept 加上,保险起见都写全了:

app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Authorization, Accept');
if (req.method === 'OPTIONS') {
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
return res.status(200).end();
}
next();
});


这段代码里我还加了 OPTIONS 请求处理,因为预检请求会用到。别走弯路,直接按这个来准没错,之前我就是因为少写了这些浪费了不少时间调试。

还有个小坑要注意,如果你用了自定义的响应头,也得在 Access-Control-Expose-Headers 里声明出来,不然前端读不到这些值。不过这跟你现在的 CORS 错误没关系,先解决当前的问题再说。
点赞
2026-03-26 17:02