Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: rewrite в именованный location
- To: nginx-ru@xxxxxxxxx
- Subject: Re: rewrite в именованный location
- From: Gena Makhomed <gmm@xxxxxxxxx>
- Date: Fri, 14 Oct 2011 14:59:49 +0300
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=csdoc.com; s=dkim; t=1318593590; bh=4Ep1m1zVfG9fNU74ZC1j9TaaZzxvC7/b3TSRQKuQsQI=; h=Message-ID:Date:From:MIME-Version:To:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=Yfk7dppGF2dcB1sBg4nLpsQPpS+LtoVTUCKypbGTp5mtu1zFidjIGz1PLpDBaBtOr kNHLWN5HUJiy01yLzGNZV2ico3IRibT9Cor5KwTbIfcVjZF1nx4TTlEsUCdSOEfkjO 7qIMVnjEFEZtp2UjIroHDPgN2qnNxh8vtwseFIac=
- In-reply-to: <20111014105323.GC97305@xxxxxxxxx>
- References: <4E974072.6@xxxxxxxxx> <20111014105323.GC97305@xxxxxxxxx>
On 14.10.2011 13:53, Igor Sysoev wrote:
не планируется ли сделать в nginx синтаксический сахар
для конструкции "error_page 345 = @name; return 345;" ?
потому что хак "try_files @name;" короткий, но не красивый.
идеальным вариантом синтаксиса наверное будет "goto @name;" ?
и/или "rewrite ^ @name;" если бывает необходимо сделать условный goto,
который будет выполняться только если $uri соответствует regexp`у.
наверное в 80-90% всех случаев надо будет только безусловный goto,
а "условный goto" будет нужен не так часто, поэтому лучше оба варианта?
P.S. http://catap.ru/blog/2009/07/28/nginx-rewrite-to-named-location/
Лично я против goto, потому что это приведёт к тому, что люди ради
экономии пары строк будут его использовать там, где нужно сделать
законченную конфигурацию внутри location'а. Это а) приводит
к неподдерживаемым конфигурациям, b) такие конфигурации будут
присылаться в список и мне придётся им разбирать. Не хочу.
Ok, но ведь с другой стороны http://wiki.nginx.org/IfIsEvil
и полностью безопасной конструкцией внутри if(){ } является
только return или rewrite с уходом в другой location.
Поэтому конструкция "error_page 345 = @name; return 345;"
применяется в качестве workaround`а, чтобы можно было сделать
в конфиге то, что никакими другими способами сделать нельзя.
Против goto и Дейкстра, http://ru.wikipedia.org/wiki/GOTO
по аналогичным причинам. А как насчет вариата "rewrite ^ @name;"?
- это ведь rewrite, и то что по сути есть goto - не так очевидно.
Просто "rewrite ^ @name;" - это гораздо меньше текста писать надо,
и кроме того, не надо будет придумывать уникальные цифровые метки,
как это делается в goto через "error_page 345 = @name; return 345;"
==================================================================
Хорошим вариантом для устранения избыточности конфига могли бы быть
макросы, аналогичные апачевскому mod_macro, только в C-like синтаксисе.
по сути, макросы - это include с параметрами, но без отдельного файла.
Читаемость конфига и легкость поддержки от этого только вырастут, имхо.
Например, с аналогичными целями в исходниках nginx применяется #define,
чтобы не нарушать http://en.wikipedia.org/wiki/Don%27t_repeat_yourself
Выносить "общие" фрагменты конфига в отдельные внешние файлы -
это очень неудобно при большом количестве виртуальных хостов.
И нельзя сразу понять, где еще используется включаемый файл,
так что не очевидно, что изменится после его редактирования.
Или лучше всего - сделать свой собственный генератор конфига nginx,
так что на входе у него будет как угодно компактный и удобный DSL,
а на выходе - raw конфиг nginx, с большой избыточностью текста.
Но это ведь дополнительный уровень, который может добавлять ошибки.
Каких-либо других способов уменьшить избыточность конфига nginx,
и нарушение принципа DRY кроме трех вышеперечисленных - не нахожу.
Возможно - больше никаких способов кроме этих трех и не существует.
Стратегически - какое направление будет самое правильное и лучшее?
Учитывая, что число пользователей будет расти и не все читали доку,
- наверное аналог апачевского mod_macro, чтобы убрать избыточность?
--
Best regards,
Gena
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|