Cors 不适用于两个不同的来源

Cors is not working for two different origins

我有两台服务器,前端 (Next.js) 和后端 (express.js api 服务器)。

前端服务器 运行 没有任何添加。但是我有一个后端的 nginx 代理。


到目前为止一切都很好,因为它们还没有连接。

当我从前端服务器向后端服务器进行 fetch get 调用时,通常会出现 cors 错误,因为来源不同。

为此,我将后端服务器设置为 cors:

// /src/middlewares/cors.ts
import cors from 'cors';
const whitelist = new Set(['http://192.168.1.106:3000', 'https://192.168.148.132']);
// frontend: http://192.168.1.106:3000
// backend: https://192.168.148.132
const corsOptions = {
  optionsSuccessStatus: 200,
  origin: (origin: any, callback: any) => {
    console.log('origin: ' + origin);
    if (whitelist.has(origin)) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
  //   credentials: true,
};
export default cors(corsOptions);

// /app.ts
import cors from './middlewares/system/cors.js';
.
.
// setup cors
app.options('*', cors);
app.use(cors);
.
.

这样做之后,我达到了我的主要目标。前端服务器可以调用后端服务器。 输出:

但是这次我发现了一个问题。我无法再向后端发送自我请求(通过自我来源)。

在处理这个问题时,我查看了上面显示的 /src/middlewares/cors.ts 文件的来源。


我在 nginx 中使用自签名 ssl 作为后台服务器。 而且conf中没有任何cors相关的头文件。

我该如何解决这种情况?

(如有遗漏,可在评论中指出。)

Origin header 仅在 cross-origin 请求中设置。如果你直接调用你的后端,Javascript 值为 undefined,在这种情况下你不能限制任何东西。例如,您可以写

if (!origin || whitelist.has(origin)) {
  callback(null, true);
}