如何阻止代理服务器将请求重定向至非目标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
相关产品推荐
相关产品推荐

