Nginx gzip过滤器无法使用我的自定义处理程序

hel*_*yan 6 gzip module nginx handler

我写了一个非常简单的nginx处理程序,只输出一些文本(大小100B到10KB).

代码适用于nginx(版本1.0.6)

但我发现gzip过滤器无法与处理程序一起使用.

当我在nginx.conf(在http部分下)打开gzip时,gzip使用静态html文件工作.

但是,处理程序的响应不是用gzip压缩的.

经过大量的搜索工作,我仍然找不到答案.

任何意见 ?非常感谢.:-)

//my code :
static ngx_int_t ngx_http_test_handler(ngx_http_request_t *r){

    ngx_chain_t out;
    ngx_buf_t *b;

    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

    ......
    //writing text to buffer
    ......
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = len;
    r->headers_out.content_type.len = sizeof("text/html")-1;
    r->headers_out.content_type.data = (u_char *) "text/html";

    out.buf = b;
    out.next = NULL;
    return ngx_http_output_filter(r, &out);
}
Run Code Online (Sandbox Code Playgroud)

App*_*234 0

首先你的电话打到哪里ngx_http_send_header(r);

您正在初始化 的成员吗 ngx_buf_t *b

您的请求内容编码设置了吗?

您的处理程序会产生错误吗?如果是这样,不会调用任何过滤器?

为了确保 gzip 过滤器在被处理程序调用时运行(而不是被绕过),需要满足其他约束,包括

  • 必须在 nginx 配置文件中启用 Gzip,请参阅此处
  • 发送的标头状态应为 NGX_HTTP_OK、NGX_HTTP_FORBIDDEN 或 NGX_HTTP_NOT_FOUND
  • 应设置内容编码(ngx_table_elt_t* 必须存在并且其中的值应具有非零长度
  • content_length_n应该有效(不是-1)并且应该大于或等于配置文件中指定的gzip_min_length值
  • ngx_http_test_content_type 需要返回非 null,例如,有效的上下文类型
  • 请求需要有 header 和 body

有关 Nginx 模块、Fillter 和 Handler 开发的更多信息,请参阅此处。