allow/deny and return

Gena Makhomed gmm at csdoc.com
Tue Oct 15 16:14:22 UTC 2013


On 15.10.2013 16:45, Maxim Dounin wrote:

>>>> В такой конфигурации:
>>>>
>>>> location /closed {
>>>>    allow 10.1.1.1;
>>>>    deny all;
>>>>    return 200 "secret\n";
>>>> }
>>>>
>>>> allow/deny ни на что не влияют.
...
>> я прочитал http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
>> но так и не смог понять, почему allow и deny тут не будут работать.

> Потому что директивы модуля rewrite - это фактически часть выбора
> конфигурации.  И именно от выбранной конфигурации зависит, что
> можно, а что - нельзя.

вот дословно что сейчас написано в документации:

The ngx_http_rewrite_module module is used to change URIs using regular
expressions, return redirects, and conditionally select configurations.

"conditionally select configurations" - это только evil директива "if".
остальные директивы, кроме rewrite, являются unconditional. разве нет?

>> это все похоже на BUG, потому что пользователи обычно подразумевают,
>> что сначала работает access module и только потом - rewrite_module.
>>
>> по крайней мере, в UNIX и даже в WINDOWS все работает именно так:
>> если доступа к файлу нет, никаких операций с ним сделать нельзя.

> В Антоном конфиге нет файла.  Есть инструкция "при выборе
> конфигурации для обработки запросов вернуть ответ с кодом 200".

файла нет. но есть location /closed и есть директивы задания доступа
кому allow, а кому deny. то что return срабатывает раньше deny - это
будет совершенно неожиданно для более чем 99% пользователей nginx...

> (И да, я таки считаю, что возможность задавать тело ответа была
> добавлена в диркетиву return зря, не её это работа.  Надо было
> сделать отдельный модуль a la empty gif, подобных вопросов было бы
> меньше.  Но таки этот фарш уже поздно проворачивать назад.)

почему поздно? и сейчас можно сделать отдельный модуль return, который
будет срабатывать как content handler возвращая код статуса и урл/текст

return code [text];
return code URL;
return URL;

а из модуля rewrite директиву return тогда можно будет вообще убрать.
в этом случае - вообще ничего не изменится, кроме того, что директивы
из access module отработают раньше, чем return, как это и должно быть.

P.S. есть такая книга "Безумно просто. Вдохновляющие примеры Apple"
http://www.mann-ivanov-ferber.ru/books/paperbook/bezumno-prosto/
см. "Отрывки из книги, [PDF] Введение. Посох Простоты 113 КБ".

из рецензии:

«Простота всегда в моде», — говорит автор книги Кен Сигал. «Бизнес 
тенденции приходят и уходят, но простота остается всегда. Предпочтение 
простоте заложено в нашей ДНК и это вряд ли изменится в течение 
нескольких миллиардов лет.

Организации, которые понимают это могут превратить простоту в 
конкурентное преимущество. Поэтому, что это просто жизненный факт: при 
наличие выбора, человек всегда выберет более простой путь. Внутри 
огранизации простота экономит время и деньги, создает лучшие условия 
работы и поднимает боевой дух. Совсем не плохо для концепции, которая не 
стоит ни копейки».

-- 
Best regards,
  Gena



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