1

我正在编写一个自定义 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 响应

如何通过重定向响应客户端?

4

0 回答 0