Node 代理访问的实现可以分为两步:
- 使用
http.request
或https.request
创建一个代理请求,并将请求转发给目标服务器。示例如下:
const http = require('http');
http.createServer(function(req, res) {
console.log(req.url);
const options = {
hostname: 'backend-server.com',
path: req.url,
headers: req.headers
};
const proxyRequest = http.request(options, function(proxyResponse) {
res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
proxyResponse.pipe(res);
});
req.pipe(proxyRequest);
}).listen(8080);
在以上示例中,我们创建了一个 HTTP 服务器,将发往该服务器的请求转发至 backend-server.com 上的服务器。使用 http.request
调用创建代理请求,并使用 req.pipe
将浏览器请求中的数据流输出到代理请求中。同时,在代理服务器响应后,使用 proxyResponse.pipe(res)
将代理服务器响应中的数据流输出到浏览器响应中。
- 处理代理请求及响应,使其在被转发至目标服务器之前或之后进行修改。示例如下:
const http = require('http');
http.createServer(function(req, res) {
const options = {
hostname: 'backend-server.com',
path: req.url,
headers: req.headers
};
const proxyRequest = http.request(options, function(proxyResponse) {
// 对代理响应进行修改
proxyResponse.headers['Cache-Control'] = 'no-cache';
res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
// 对代理响应数据进行修改
let body = '';
proxyResponse.on('data', function(chunk) {
body += chunk;
});
proxyResponse.on('end', function() {
body = body.replace(/backend-server.com/g, 'frontend-server.com');
res.end(body);
});
});
// 对代理请求进行修改
if (req.url.indexOf('/static/') === 0) {
req.url = '/prod/static' + req.url.slice(7);
}
req.pipe(proxyRequest);
}).listen(8080);
在以上示例中,我们在创建代理请求时,修改了请求头,并在返回代理响应时,修改了响应头和响应数据。同时,我们还在创建代理请求时,处理了请求 URL,使其把前缀 /static/
转换为 /prod/static
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node 代理访问的实现 - Python技术站