allow/deny and return

Maxim Dounin mdounin at mdounin.ru
Wed Oct 16 18:19:11 UTC 2013


Hello!

On Wed, Oct 16, 2013 at 09:25:19PM +0400, Ruslan Ermilov wrote:

[...]

> > В документации на rewrite: 
> > http://nginx.org/en/docs/http/ngx_http_rewrite_module.html не нашел явное 
> > указание на то, что директивы этого модуля выполняются до модулей access-фазы 
> > (ngx_http_access_module,ngx_http_auth_basic_module, ngx_http_auth_request_module).
> > 
> > Если знать внутреннюю архитектуру nginx то это очевидно, но прочитав только 
> > документацию на ngx_http_rewrite_module и ngx_http_access_module догадаться 
> > будет сложно.
> 
> То, что в описанном тобой случае директива access "не выполняется",
> можно понять, прочитав раздел "Внутреннее устройство", нюанс про
> директиву limit_rate.

IMHO, и из последовательности обработки директив в самом начале 
описания модуля - тоже понятно, что до выполнения директив модуля 
rewrite - location не выбран, и директивы модуля access не имеют 
шанса примениться до rewrite'ов.

С другой стороны - никто не мешает построить систему, в которой 
между find config и location rewrite стоит проверка access, и 
тогда та же схема - лишь слегка отличается от реальности (а от 
реальности она и сейчас слегка отличается, т.к. могут быть ещё и 
3rd party модули в rewrite-фазе), но allow/deny работают до 
return.  Не будут работать всякие другие вещи, но это уже детали.

[...]

> Надо донести мысль о том, что rewrite (включая ВСЕ его директивы) -
> это процесс поиска location'а.  При обработке запроса сначала выполняется
> поиск location'а по URI, затем выполняются директивы модуля rewrite (и
> только они!) для данного location'а (*), в рез-те location может измениться,
> процесс повторяется.  Также в процессе поиска location'а выполнение
> запроса может и вовсе завершиться (return, rewrite redirect).
> И лишь потом, когда найден конечный location, "выполняются" остальные
> директивы, включая access-модули.

Да-да, как-то так.

[...]

> Возможно достаточно будет переформулировать это так:
> 
> < Директивы модуля ngx_http_rewrite_module обрабатываются в следующем порядке: 
> 
> > Обработка запроса начинается с выполнения директив модуля ngx_http_rewrite_module.
> > Директивы обрабатываются в следующем порядке:

Предлагаемое изменение - неверно, т.к. даже до серверных 
rewrite'ов есть как минимум одна фаза обработки запроса, не говоря 
уже о всяких явных вещах и 3rd party модулях в rewrite-фазе.

Ну и вышеописанный теоретический вариант тактовки описанной схемы 
работы как приблизительной, с выполнением access-фазы между find 
config и rewrite - не исключает.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



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