Javascript Nodejs代理脚本,不使用mod_deflate

Javascript Nodejs代理脚本,不使用mod_deflate,javascript,apache,proxy,node.js,Javascript,Apache,Proxy,Node.js,我创建了一个小的代理节点脚本,它可以查找request.url 并将请求传递给我的apache服务器或使用节点 处理/响应此请求。到目前为止,我已经取得了成功, 一切正常,但当我为apache启用mod_deflate时, “奇怪的事情会发生” 看起来节点只是“取消”或“停止”了对早期的响应方式。 我正在从我的请求中监听“数据”事件,并且在某个时刻 节点只是决定响应已经结束(这是错误的),并且 激发“结束”事件 代码段: var apache = http.createClient(82, 'l

我创建了一个小的代理节点脚本,它可以查找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');
您可以在&&
编辑:暂时禁用节点

请记住,如果用户没有使用gzip/deflate,这就像一个符咒 阿帕奇。我试图在回复中将编码设置为“二进制”,但没有 也不是成功

我是不是遗漏了什么?有人能证实这种行为吗? 我正在使用最新的relase(0.2.0)


是否有其他(更好的)解决方案可以使用这样的代理脚本?

我很感兴趣。我启动了你的代码并指向了www.typeofnan.com。它工作正常,但我注意到服务器没有返回压缩响应。因此,我将其设置为proxy apache.org,我的浏览器也将其与gzip内容完美结合!对于GET on“/”,我得到了以下响应标题:

{"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"}
嗯。。。我只是运气好,没有得到引起你问题的gzipped回复吗?您是否有一个页面可以可靠地导致“奇怪的事情发生”,我可以对其进行测试?实际上,您可能需要定义“事情会发生”:

作为黑客,您可以让代理更改accept编码头,这样apache就永远不会返回压缩响应。向apache请求中添加以下内容将强制apache返回未压缩的响应:

req.headers['accept-encoding'] = '*;q=1,gzip=0';

当我在我的服务器上禁用
mod_deflate
时,代理脚本可以正常工作。无论如何(禁用mod_deflate或使用accept头),这不是我想要的。我想让actice从apache压缩,我想让node能够通过它(这仍然不起作用)。目前,我禁用了nodejs,它是100%的apache。我已经在我的帖子中描述了“奇怪的事情”。节点只是停止发送数据,无论是更早还是更晚。在中间传输一个JS/CSS/HTML/任何文件,就停下来。我只是想澄清一下,我的意思是你可以让node做gzip,让apache在没有它的情况下响应。那么,当加载一个特定的文件时,它会崩溃吗?对这个问题的回答似乎不太正确。看起来cgi配置不正确。也许删除supply.files(..)调用,看看node是否更喜欢它。