В хендлере модуля используется location-конфигурация уровня сервера

Alrond rusnginx at gmail.com
Wed Oct 28 03:04:22 MSK 2009


Немного замысловато звучит :) Какое-то странное поведение хендлера
обнаружил.

Небольшое введение: модуль - каркас с двумя переменными "blabla" и
"blabla_disable". Действия модуля распростроняется на все сервера, кроме тех
locations, где будет "blabla_disable on"
Поэтому используется конфигурация уровня location и server. Такого я правда
пока ни в одном модуле не встречал.

static ngx_http_module_t  ngx_http_blabla_module_ctx = {
    NULL,                             /* preconfiguration */
    ngx_http_blabla_init,             /* postconfiguration */

    NULL,                             /* create main configuration */
    NULL,                             /* init main configuration */

    ngx_http_blabla_create_srv_conf,  /* create server configuration */
    ngx_http_blabla_merge_srv_conf,   /* merge server configuration */

    ngx_http_blabla_create_loc_conf,  /* create location configration */
    ngx_http_blabla_merge_loc_conf    /* merge location configration */
};

В ините добавляется ngx_http_blabla_handler. Пока всё стандартно.
Самое интересное поведение - в хендлере:

static ngx_int_t
ngx_http_blabla_handler(ngx_http_request_t *r)
{
    ngx_http_blabla_srv_conf_t *conf;
    ngx_http_blabla_loc_conf_t *confl;

    conf = ngx_http_get_module_srv_conf(r, ngx_http_blabla_module);
    confl = ngx_http_get_module_loc_conf(r, ngx_http_blabla_module);

    if (confl->disable) {
        return NGX_DECLINED;
    }

    /*  Future logic */
    return NGX_DECLINED;
}

Задумано так, что берется конфигурация переменных уровня сервера и уровня
локейшена для запроса.
Проверяется что в этом локейшене "blabla_disable on" и ничего не делается.
Во всех остальных случаях идет дальше на обработку.
Но в реальности "blabla_disable" проверяется того же уровня, где расположена
переменная "blabla".
Как пример, запрос идет на /tamtam И модуль должен пропустить этот запрос.
(в реальности это редкий случай, поэтому по умолчанию везде "blabla_disable
off")

server {
    blabla "test";
    //blabla_disable off;

    location /tamtam {
        blabla_disable on;
    }
}

Почему "ngx_http_get_module_loc_conf" берет данные не для запрашиваемого
локейшена, а от того места, где идет инициализация хендлера и переменной
"blabla"?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20091028/e819783b/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ngx_http_blabla_module.c
Type: text/x-csrc
Size: 4296 bytes
Desc: not available
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20091028/e819783b/attachment.c>


More information about the nginx-ru mailing list