index internal redirect

Gena Makhomed gmm на csdoc.com
Вс Июн 19 15:50:44 MSD 2011


On 17.06.2011 23:23, Gena Makhomed wrote:

[...]

> если надо иметь возможность указывать какие-то дополнительные параметры
> для этих модификаторов, тогда можно в дальнейшем расширить синтаксис еще
> дальше:
>
> internal_redirect( дополнительные параметры )::/system/maintenance.html

дополнение к первому сообщению:

для модификатора internal_redirect:: пока что я смог только придумать
всего один дополнительный (необязательный) параметр: название location
в который надо сделать внутренний редирект. например:

на русском языке:

"... сделать внутренний редирект в локейшн @maintenance
если существует файл /system/maintenance.status ..."

на языке конфига nginx:

try files internal_redirect( @maintenance )::/system/maintenance.status
           $uri
           $uri/
           @backend
	  ;

что с русского на nginx`овский язык, что с nginx`овского на русский
- такой синтаксис достаточно легко переводится, читается и понимается.

кроме варианта @maintenance в качестве параметра допускается
также /maintenance.html и возможно имеет смысл разрешить значение
с использованием переменных, например internal_redirect( $variable )
или internal_redirect( $var1$var2${var3} ) и т.п.

======================================================================

аналогично для модификатора absolute_path:: пока что есть только один
дополнительный (необязательный) параметр: можно указать root, который 
использовать для построения абсолютного пути вместо значения
директивы root, которое используется, если не задан модификатор
"absolute_path::".

это необходимо для того, чтобы можно было реализовать функциональность 
http://www.lexa.ru/nginx-ru/msg40749.html на операционных системах
в которых отсутствует единая файловая система с одним корнем.
в частности, в операционных системах windows. например:

на языке конфига nginx:

try_files absolute_path( K:/storage/img1/ )::/$img
           absolute_path( L:/storage/img2/ )::/$img
           absolute_path( M:/storage/img3/ )::/$img
           absolute_path( N:/storage/img4/ )::/$img
           absolute_path( O:/storage/img5/ )::/$img
           absolute_path( P:/storage/img6/ )::/$img
           absolute_path( Q:/storage/img7/ )::/$img
	  =404
           ;

на русском языке:

если существует файл по абсолютному пути "K:/storage/img1/" + "$img" ...

насколько я знаю, монтировать сетевой ресурс в каталог на существующей
локальной файловой системе NTFS в операционных системах Widnows
не умеют, поэтому такой "расширенный" синтаксис модификатора
"absolute_path::" - это единственный способ решить задачу
аналогичную http://www.lexa.ru/nginx-ru/msg40749.html под виндой.

в качестве параметров для absolute_path будет также полезным
разрешить использование переменных и их комбинаций, например:

absolute_path( N:/storage/$hostname/ )::/$img
absolute_path( N:/storage/$hostname/$server_name/ )::/$img
и т.п. - хотя это и несколько противоречит общей идеологии
nginx как высокопроизводительного сервера, но на production
windows server`e пользователи могут использоваться конфиги написанные
вручную или генератором конфигов, а на development windows server`е,
где не нужна очень высокая производительность, пользователи смогут
использовать такой вариант с переменными $hostname, $server_name и т.п.

======================================================================

кроме того, при желании могут быть совмещены оба модификатора
с параметрами, или без в любой комбинации. например, так:

try_files internal_redirect( @maintenance )::absolute_path( N:/ )::/flag

или так:

try_files absolute_path( N:/ )::internal_redirect( @maintenance )::/flag

это не так удобно для чтения конфига человеком, но может быть удобным
в случае применения автоматических генераторов конфига, которым не надо
будет задумываться о том, чтобы располагать модификаторы в определенном,
единственно разрешенном порядке.

======================================================================

дополнительное обоснование, почему такой синтаксис для модификаторов
лучше всего:

1. если использовать звездочки и другие спецсимволы - такой конфиг будет
гораздо труднее понять, будет легче сделать опечатку и случайную ошибку.

2. если использовать звездочки и спецсимволы - такой синтаксис конфига
nginx будет больше похож на синтаксис апачевского mod_rewrite
и синтаксис конфигурационного файла sendmail - там как раз применяется
такой подход, что один символ означает одну опцию или один модификатор.

3. предлагаемый вариант хорошо читается и легко воспринимается,
а ведь к конфигу nginx со стороны системного администратора
в общем случае будет больше обращений с операцией чтения,
чем с операцией записи, поэтому не стоит превращать конфиг
nginx в write-only language, который можно будет очень легко
и быстро написать, но потом гораздо труднее прочитать и понять,
как это уже частично произошло с синтаксисом языка perl5 / perl6.

4. такой синтаксис "модификатор::" и "модификатор( параметры )::"
позволяет легко и просто добавлять любые другие модификаторы,
которые потом могут потребоваться в дальнейшем, причем не только
для директивы try_files, но и в других местах конфига nginx.

5. Bjarne Stroustrup, автор и создатель языка С++ в своей книге
пишет, что когда он создавал синтаксис С++ и у него был выбор,
сделать синтаксис более понятным и удобным для человека,
или сделать синтаксис более простым для реализации синтаксического
разбора - он всегда выбирал первый путь - делать синтаксис более
удобный и более понятный для человека. В результате у него всеравно
получился монстр - http://ru.wikipedia.org/wiki/C%2B%2B0x,
который временами труднее понимать чем конфиг сендмейла,
но это у него так вышло уже по совсем другим причинам.

======================================================================

если это будет необходимо, присутствует также возможность для
дальнейшего расширения этого синтаксиса - для того чтобы можно было
указать несколько параметров, разделять их запятыми, а если в тексте
параметра присутствует символ "запятая", то весь текст брать в кавычки.
или esc`пить символ запятой. например:

модификатор( параметр1, параметр2, параметр3 )::

модификатор( пара\,метр1, параметр2, "па,ра,метр,3" )::

если возможных параметров много, но не все они будут нужны
одновременно, тогда использовать вариант синтаксиса python:

модификатор( имя5=параметр5, имя8=параметр8, имя3=параметр3 )::

при этом в имени параметра не может быть символ "," или "=",
а если в значении параметра встречаются символы "," или "=",
тогда всю строку параметров брать в одинарные или двойные кавычки.
или esc`пить эти спецсимволы, указывая их в тексте так: \, или \=

-- 
Best regards,
  Gena




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