You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止代理服务器将请求重定向至非目标URL并解决CORS错误?

解决代理服务器URL被篡改及CORS跨域问题

问题核心分析

你的代理服务器本应请求api.foreign.com/route,但实际浏览器请求流向了www.foreign.com/route并触发CORS错误,原因是:

  • 目标服务器针对代理添加的请求头(如User-Agent、Accept)返回了指向www.foreign.com的重定向响应
  • 即便设置了followRedirects: false,浏览器仍会自动跟随该重定向,导致请求流向错误域名

解决方案

1. 拦截并移除重定向响应头

在proxyRes拦截器中删除目标服务器返回的Location头,阻止浏览器自动跳转:

proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
    try {
        // 移除目标服务器返回的重定向头,避免浏览器跳转
        if (proxyRes.headers.location) {
            delete proxyRes.headers.location;
        }

        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' });
    }
}),

2. 提前处理OPTIONS预检请求

浏览器跨域请求前会先发OPTIONS预检,需在代理前添加全局CORS中间件,确保预检请求被正确响应:

// 放在代理中间件之前执行
app.use((req, res, next) => {
    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');
    // 直接响应OPTIONS预检请求
    if (req.method === 'OPTIONS') {
        return res.sendStatus(200);
    }
    next();
});

3. 优化路径与参数处理逻辑

避免直接拼接查询参数,改用更可靠的方式传递参数,防止路径解析错误:

pathRewrite: (path, req) => {
    // 直接替换路径为/route,查询参数由代理自动传递
    return '/route';
},
// 统一处理查询参数(可选)
query: (req) => {
    return { data: req.query.data };
},

4. 验证请求头触发条件

在Postman中添加代理使用的User-Agent和Accept头,测试是否触发重定向。如果确实是这些头导致的,可调整代理请求头(比如使用更简洁的User-Agent),避免触发目标服务器的重定向规则。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:52:45