停止快速跨服务器将请求重定向到另一个网址

问题描述 投票:0回答:1

我有一个服务器向外部服务器 api.foreign.com/route 发送请求。问题是,当我在控制台中从浏览器发送请求时,我收到一个 cors allowed-origin 错误,它表示该错误来自 www.foreign.com/route 。网址不应更改,因为 www.foreign.com/route 上没有任何内容。这是我服务器上的 api:

app.use('/api/fetchData', createProxyMiddleware({
    target: 'https://api.foreign.com',
    changeOrigin: true,
    followRedirects: false,
    pathRewrite: (path, req) => {
        const { data } = req.query;

        return `/route?data=${data}`;
    },
    selfHandleResponse: true,
    on: {
        proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
            try {
                console.log("requesting");
                if (!responseBuffer || typeof responseBuffer !== 'object' || responseBuffer.length === 0) {
                    throw new Error('Invalid or empty response from target server');
                }
                const response = responseBuffer.toString('utf8');

                res.setHeader('Access-Control-Allow-Origin', '*');
                res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
                res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
            
                return JSON.stringify({ id: response });
            } catch (error) {
                res.statusCode = 500;
                return JSON.stringify({ error: 'Failed to process response from target server' });
            }
        }),
    },
    headers: {
        Accept: "application/json",
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
    }
}));

我尝试执行从 Postman 到 api.foreign.com 的请求,并收到包含所需数据的 200 响应。如何防止网址更改。

我在请求中添加了标头,以防止外部服务器出现 Cors 问题,但现在他们更改了服务器 url,这个问题开始发生。

express api http proxy
1个回答
0
投票

要解决 CORS 错误,外部服务器应该允许您的源。当然,当您使用 Postman 测试 api 调用时,您收到了 200 响应,但 Postman 不在浏览器中运行,因此它不强制执行 CORS 策略,这就是您在 Postman 中收到 200 响应的原因。 CORS 策略仅针对域实施,因此一旦外部服务器允许您的来源,您就可以从外部服务器获取数据。希望对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.