【问题标题】:Cors is not working for two different originsCors 不适用于两个不同的来源
【发布时间】:2022-01-22 23:54:24
【问题描述】:

我有两台服务器,前端(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相关的头文件。

我该如何解决这种情况?

(如果我遗漏了什么,您可以在 cmets 中指出。)

【问题讨论】:

    标签: javascript express nginx cors


    【解决方案1】:

    Origin 标头仅在跨域请求中设置。如果你直接调用你的后端,Javascript 值是undefined,在这种情况下你不能限制任何东西。例如,你可以写

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

    【讨论】:

    • 是的,the part 我在文档中遗漏了很多时间。谢谢你提醒我。
    猜你喜欢
    • 2017-02-11
    • 2017-07-06
    • 2014-10-09
    • 2014-12-08
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多