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