Nginx模块:如何从过滤器重定向?

时间:2019-03-19 09:14:11

标签: c nginx nginx-module

我正在编写一个自定义nginx模块,在其中使用过滤器进行一些处理。过滤器的设置如下所示:

static ngx_int_t ngx_http_mymodule_init(ngx_conf_t *cf)
{
    ngx_http_next_header_filter = ngx_http_top_header_filter;
    ngx_http_top_header_filter = ngx_http_mymodule_header_filter;

    ngx_http_next_body_filter = ngx_http_top_body_filter;
    ngx_http_top_body_filter = ngx_http_mymodule_body_filter;
    return NGX_OK;
}

我正在此body过滤器中处理一些逻辑,并且在特定条件下,我想在客户端的浏览器中执行到localhost的重定向。过滤器主体代码如下所示:

static ngx_int_t
ngx_http_mymodule_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
    ctx = ngx_http_get_module_ctx(r, ngx_http_mymodule_module);
    if (ctx == NULL) {
        return ngx_http_next_body_filter(r, in);
    }

    bool success = __my_custom_logic(r);
    if (success == false) {
        ngx_http_set_ctx(r, NULL, ngx_http_mymodule_module);

        // Do the redirect here! How?

        // Setting the Location header and changing r->headers_out.status to 302
        // just returns an empty HTTP 200 to the client instead...
    }

    ngx_http_set_ctx(r, NULL, ngx_http_mymodule_module);
    return ngx_http_send_special(r, NGX_HTTP_LAST);
}

我尝试过的事情:
 -将Location标头和headers_out.status设置为302,但它会向客户端返回空响应
 -设置headers_out.location,但仍返回空响应
 -调用ngx_http_send_header(r),但这会返回NGX_ERROR响应

我该如何重定向到客户端?

0 个答案:

没有答案