【发布时间】:2010-09-04 13:46:26
【问题描述】:
我创建了一个小代理节点脚本,用于查找 request.url 并将请求传递给我的 apache 服务器或使用节点 处理/响应此请求。到目前为止,我已经成功了, 一切正常,但是当我为 apache 启用 mod_deflate 时, “奇怪的事情会发生”。
看起来节点只是“取消”或“停止”了早期的响应方式。 我正在根据我的请求收听“数据”事件,并且在某个时候 节点只是决定响应已经结束(这是错误的)并且 触发“结束”事件。
代码sn-p:
var apache = http.createClient(82, 'localhost');
function pass_to_apache(req, res){
var request = apache.request(req.method, req.url, req.headers);
req.addListener('end', function() {
request.end();
});
req.addListener('data', function(chunk) {
request.write(chunk);
sys.puts('writting chunk\n');
});
request.addListener('response', function(response) {
res.writeHead(response.statusCode, response.headers);
response.addListener('data', function(chunk) {
sys.puts('writting data..\n');
res.write(chunk);
});
response.addListener('end', function() {
sys.puts('end of request');
res.end();
});
});
}
var MainServer = http.createServer(function(request, response) {
sys.puts('received '+request.method+' '+request.url + "\n"+JSON.stringify(request.headers));
if(/^\/node/.test(request.url)) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end("Hi, it's node =)\n");
}
else if(/^\/exit/.test(request.url)) {
sys.puts('closing..\n');
MainServer.close();
throw new Error('forced');
}
else {
pass_to_apache(request, response);
}
});
MainServer.listen(80, 'typeofnan.com');
您可以在 www.typeofnan.com && www.typeofnan.com/node/anything
编辑: 暂时禁用 nodejs。
请记住,如果没有使用 gzip/deflate,这就像一个魅力 阿帕奇。我试图在我的回复中将编码设置为“二进制”,但没有 也成功。
我在这里遗漏了什么吗?有人可以确认这种行为吗? 我使用的是最新版本 (0.2.0)。
是否有其他(更好的)解决方案可以使用这样的代理脚本?
【问题讨论】:
标签: javascript apache proxy node.js