我创建了一个小代理节点脚本,用于查找request.url 并将请求传递给我的apache服务器或使用节点 处理/响应此请求。到目前为止我成功了, 一切正常,但是当我为apache启用 mod_deflate 时, “奇怪的事情会发生”。
看起来节点只是“取消”或“停止”早期的响应方式。 我正在听取我的请求中的“数据”事件,并且在某些时候 节点只是决定响应已经结束(这是错误的)和 激起“结束”事件。
代码段:
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)。
是否有其他(更好的)解决方案可以使用像这样的代理?
答案 0 :(得分:0)
我很好奇。我解雇了你的代码并将其指向www.typeofnan.com。它工作正常,但我注意到服务器没有返回压缩响应。那么我将它设置为代理apache.org,我的浏览器也通过gzip压缩内容实现了它!对于“/”上的GET,我得到了以下响应头:
{"date":"Mon, 13 Sep 2010 11:03:45 GMT","server":"Apache/2.3.8 (Unix) mod_ssl/2.3.8 OpenSSL/1.0.0a","last-modified":"Sat, 11 Sep 2010 19:38:09 GMT","etag":"\"c9489a-4ada-4900100c32a40-gzip\"","accept-ranges":"bytes","vary":"Accept-Encoding","content-encoding":"gzip","cache-control":"max-age=86400","expires":"Tue, 14 Sep 2010 11:03:45 GMT","content-length":"5359","keep-alive":"timeout=5, max=100","connection":"Keep-Alive","content-type":"text/html"}
嗯...我刚刚幸运,没有得到一个引起你问题的压缩反应?你有一个页面可靠地导致我可以测试的“奇怪的事情发生”吗?实际上,你可能需要定义“将要发生的事情”:)
作为一个hack,您可以让代理更改 accept-encoding 标头,以便apache永远不会返回压缩响应。将以下内容添加到您的apache请求将强制apache返回未压缩的响应:
req.headers['accept-encoding'] = '*;q=1,gzip=0';