Модуль Nginx: как перенаправить из фильтра? - PullRequest
1 голос
/ 19 марта 2019

Я пишу пользовательский модуль 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

Как я могу ответить перенаправлением на клиента?

...