accessing variables from a module

Alexander Zheglov tolko.bi.vyzhit на gmail.com
Чт Сен 8 18:23:55 UTC 2011


Roman Vasilyev.

Прошу прощения за создание нового threada, я подписался на дайджесты (переподписался на сообщения) и не могу ответить непосредственно на письмо.


> Скорее всего вы наступаете на стандартные грабли.
> 
> Ваш модуль регистрирует обработчик до того как NGINX ушел в rewrite фазу, поэтому рерайт переменных просто еще не существует на момент работы вашего обработчика.
> И поидее ваш конфиг должен выглядить как:
> 
> location ~* "whatastring" {
>     my_module off;
> }
> 


Собственно так это и работает. Но часто возникает ситуация когда удобнее отключить работу модуля только для whatastring. Размывание конфигов многими локейшнами затрудняет и чтение и поддержку.

Хендлер модуля регистрируется в NGX_HTTP_ACCESS_PHASE, что вроде как после NGX_HTTP_REWRITE_PHASE.

Я, кажется, не понимаю каких то базовых принципов работы, так что я просто поясню, что я пытался сделать.

Насколько я вижу есть 2 основные функции получения значения переменной:
ngx_http_get_indexed_variable
ngx_http_get_variable

Первая требует индекса переменной. Ок, я могу создать переменную при инициализации модуля, но тогда мне потребуются хендлеры переменной на get и set, а вот их как раз хотелось отдать в rewrite модуль. Получить индекс переменной из обработки запроса я не нашел как - требуется структура конфигурации сервера.

Вторая функция ищет переменную по имени, но у нее загадочный третий параметр key, назначение которого я из исходных текстов не вычленил.

Собственно вопрос остается, можно ли обратиться к переменной через эти функции из обработчика?

> Добрый день!
> 
> Я использую собственный модуль для nginx и столкнулся со следующей проблемой.
> 
> Предполагалась следующая конфигурационная структура для иллюстрации идеи:
> 
> location / {
>         my_module_command param;
> 
>         if ( $request_uri ~* "whatastring" ) {
>                 set $my_module_ignore 1;
>         }
> 
>         root /;
> }
> 
> Переменная my_module_ignore по задумке должна была поддерживаться модулем 
> rewrite. Я не могу найти механизма, который бы мне позволил обратиться к 
> переменным не моего модуля на чтение из handlera моего модуля. Обычный способ - 
> посмотреть как уже сделано - не сработал. Я плохо искал, такого механизма нет 
> или такой механизм вреден?
> 
> Похожая идея есть у proxy_module в команде cache_proxy_bypass, но, насколько я 
> вижу значение заносится в дальнейшем в структуру upstream (хотя я не разобрался 
> даже как оно вычисляется), а мне хотелось бы получить просто доступ на чтение к 
> переменной модуля rewrite.
> 
> 
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20110908/b2a8a135/attachment-0001.html>


Подробная информация о списке рассылки nginx-ru