我在尝试使用http-proxy路由到本地主机时遇到麻烦。
我正在使用IISNODE,但从控制台应用程序都无法正常工作。
例如,如果将“目标”设置为google,它也可以在此代码段中创建的local:9000上使用,但不适用于在本地IIS中运行的网站
有任何想法吗?
更新:现在发布的代码段对我有用,但是仍然缺少很多工作。
var port = process.env.PORT;
var http = require('http'),
httpProxy = require('http-proxy'),
url = require('url');
// http Server
var proxy = new httpProxy.createServer({});
var httpServer = http.createServer(function (req, res) {
console.log('request received: ' + req.path);
var target = 'http://myapp';
if (!req.url.toString().startsWith('/')) {
target = target + '/';
}
target = target + req.url;
console.log('routing request to ' + target);
var urlObj = url.parse(req.url);
req.headers['host'] = urlObj.host;
req.headers['url'] = urlObj.href;
proxy.web(req, res, {
host: urlObj.host,
target: target,
enable: { xforward: true }
});
});
httpServer.listen(port);
String.prototype.endsWith = function (s) {
return this.length >= s.length && this.substr(this.length - s.length) == s;
}
String.prototype.startsWith = function (str) {
return this.indexOf(str) == 0;
};
我在iisnode外部测试了一个简单的节点http-proxy,它可以很好地将请求路由到任何站点,localhost iis或www。
但是在iisnode中,我也无法使其正常运行。请求标头并不完全相同,并且我们在命名管道上而不是tcp端口上运行,很难找到导致错误路由的原因。
例如,如果我们将req.url更改为“ /”,则它将请求发送到运行节点应用程序的同一域,而不是目标域。
一种可能的解决方案是使用IIS反向代理(使用ARR和URL重写)将请求转发到在TCP端口上独立运行的节点代理应用。
我已经对其进行了测试,并且效果很好。如果需要,我可以给出配置示例。
更新:这是我使用IIS反向代理和节点代理应用程序使其工作的方式。它不使用iisnode:
一个简单的节点proxyServer.js应用程序:
var http = require('http')
var httpProxy = require('http-proxy')
var proxy = httpProxy.createProxyServer({})
var server = require('http').createServer(function(req, res) {
console.log(req.url)
proxy.web(req, res, { target: 'http://nodejs.org' })
}).listen(3000)
使用node.exe proxyServer.js运行它
在IIS中,我们需要在“应用程序请求路由”中激活ReverseProxy :
IIS服务器-> ARR:
代理设置...:
启用代理,如下所示:
然后,我在IIS中创建一个专用网站node.mydomain.com和该网站的重写规则:
<rule name="ReverseProxyInboundNodeProxy" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{CACHE_URL}" pattern="^(https?)://" />
</conditions>
<action type="Rewrite" url="{C:1}://localhost:3000/{R:1}" />
</rule>
这是一种“双重代理”解决方案,但它可以工作。我仍然无法使节点代理服务器通过iisnode运行。当然,您需要在IIS中安装ARR和URL Rewrite。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句