节点Http代理 - 基本反向代理不起作用(404s)

时间:2016-02-19 15:39:50

标签: javascript node.js proxy node-http-proxy

我正在尝试使用node-http-proxy处理一个非常简单的代理,我希望只返回google的内容:

const http = require('http');
const httpProxy = require('http-proxy');

const targetUrl = 'http://www.google.co.uk';

const proxy = httpProxy.createProxyServer({
    target: targetUrl
});

http.createServer(function (req, res) {

    proxy.web(req, res);

}).listen(6622);

例如,我希望http://localhost:6622/images/nav_logo242.png代理http://www.google.co.uk/images/nav_logo242.png,而不是返回未找到的404。

感谢。

2 个答案:

答案 0 :(得分:5)

您需要设置请求的Host标题

const http = require('http');
const httpProxy = require('http-proxy');

const targetHost = 'www.google.co.uk';

const proxy = httpProxy.createProxyServer({
    target: 'http://' + targetHost
});

http.createServer(function (req, res) {
    proxy.web(req, res);

}).listen(6622);

proxy.on('proxyReq', function(proxyReq, req, res, options) {
    proxyReq.setHeader('Host', targetHost);
});

在快递应用中,在代理部分请求时,express-http-proxy可能更容易使用。

const proxy = require('express-http-proxy');
app.use('*', proxy('www.google.co.uk', {
  forwardPath: function(req, res) {
    return url.parse(req.originalUrl).path;
  }
}));

答案 1 :(得分:4)

将http-proxy选项changeOrigin设置为true,它会自动在请求中设置host标头。

虚拟网站依赖此host标头正常工作。

const proxy = httpProxy.createProxyServer({
    target: targetUrl,
    changeOrigin: true
});

作为express-http-proxy的替代方案,您可以尝试http-proxy-middleware。 它支持https和websockets。

const proxy = require('http-proxy-middleware');

app.use('*', proxy({
   target: 'http://www.google.co.uk',
   changeOrigin: true,
   ws: true
}));