Is if evil with rewrite ... redirect?

Maxim Dounin mdounin на mdounin.ru
Чт Янв 28 18:06:33 UTC 2021


Hello!

On Thu, Jan 28, 2021 at 07:37:17PM +0300, Иван wrote:

> Здравствуйте!
> 
> Вопрос коротко: является ли
> 
> rewrite ... redirect на 100% безопасным при использовании if внутри 
> location.
> 
> 
> Подробнее:
> 
> В https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
> 
> > The only 100% safe things which may be done inside if in a location 
> > context are:
> >
> >   * return
> >     <https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return>
> >     ...;
> >   * rewrite
> >     <https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite>
> >     ... last;
> >
> то есть единственным вариантов rewrite на 100% безопасным с if в 
> location написан rewrite с last. Учитывая написанное в статье далее и 
> моё понимание nginx предполагаю, что rewrite можно не только с last, но 
> так же с redirect и permanent, так как исключают выполнение других 
> директив в рамках этого локейшена.
> 
> "Возможно опасными" тут могут быть только break и, вероятно, отсуствие 
> флагов rewrite так как оставляют возможность выполнения других директив 
> не из модуля rewrite.
> 
> Я прав?

Не совсем.

Там, собственно, кто-то бред написал про "100% safe", да останется 
это на совести того, кто полез править написанную мной статью, не 
понимая её.  Не бывает "100% безопасного" использования if'а 
внутри location'а, в лучшем случае бывает просто безопасное 
использование.

Возвращаясь к исходному вопросу про безопасность "rewrite ...  
last", то ответ тут длинный.  В случае if'а безопасность 
достигается ровно одним способом: обработка запроса не должна 
происходить внутри неявного location'а, созданного if'ом.
Это бывает в случае "rewrite ... last", а также почти бывает в 
случае "return", если по этому return'у nginx куда-то уходит в 
рамках error_page.

Если же речь идёт о том, что клиенту возвращается ответ - как в 
случае "return" без соответствующего error_page или "rewrite ... 
redirect" - то мы уже попадаем на отдельную конфигурацию, в рамках 
которой этот ответ возвращается.  Каких-либо известных проблем в 
подобных ситуациях - нет, по крайней мере со стандартными 
модулями.  Да и со сторонними скорее всего тоже - там будет простое 
наследование конфигурации, накосячить сложно.  Но таки никто не 
гарантирует, что прооблем нет совсем.

-- 
Maxim Dounin
http://mdounin.ru/


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