try_files_bypass

Gena Makhomed gmm на csdoc.com
Пт Авг 6 03:10:11 MSD 2010


On 03.08.2010 20:56, Igor Sysoev wrote:

>>> В свете такого кошмара
>>>
>>> http://kuapp.com/2010/06/30/nginx-rewrite-rules-of-wordpress-3-0-permalinks-and-wp-super-cache.html
>>>
>>> есть идея внедрить директиву try_files_bypass или bypass_try_files
>>> по аналогии с proxy_cache_bypass:
>>>
>>>      try_files_bypass   $query_string
>>>                         $cookie_comment_author
>>>                         ...
>>>                         ;
>>>
>>> Только придётся делать поддержку выржаений, для вещей типа
>>>                    "$request_method = POST"
>>>                    "$http_cookie ~* comment_author_|wordpress|wp-postpass_"
>>>
>>
>> вместо синтаксиса
>>
>> try_files_bypass   $query_string
>> 		   "$request_method = POST"
>> 	           ...
>>                      ;
>>
>> предлагаю сделать безымянные переменные с вычисляемым значением:
>>
>> try_files_bypass   $query_string
>> 		   $( $request_method = POST )
>> 	           ...
>>                      ;
>>
>> все что внутри $( ... ) - это допустимые варианты из if ( условие ).
>> значение этой переменной: 1 для случая true или "" для случая false.
>>
>> плюс в том, что парсер всегда сможет правильно понять $( условие )
>>
>> $( $http_cookie ~* "id=([^;]+)(?:;|$)" )
>>
>> что для варианта синтаксиса "условие" будет очень затруднительно:
>>
>> " $http_cookie ~* "id=([^;]+)(?:;|$)""
>>
>> и в будущем возможно будет расширение синтаксиса путем введения функций:
>>
>> $crc32( ... ),  $md5( ... ), $sha1( ... )
>>
>> $and( ... , ... ), $or( ... , ... ), $not( ... )
>>
>> например:
>>
>> $and( $( $request_method = POST ), $( $server_protocol = "HTTP/1.0" ) )
>
> Лисп, это, конечно, модно, но хотелось бы избежать.
>

пока что вижу только два варианта, как это может быть:

первый, обычный:

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

set $http_cookie_condition "";

if ( $http_cookie ~* "id=([^;]+)(?:;|$)" ) {
     set $http_cookie_condition "1";
}

try_files_bypass $http_cookie_condition;

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

предлагаемый:

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

try_files_bypass $( $http_cookie ~* "id=([^;]+)(?:;|$)" );

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

третий вариант

try_files_bypass "$http_cookie ~* "id=([^;]+)(?:;|$)"";

может быть нетривиальным для парсинга и написания из-за вложенных "

теоретически тут может помочь замена внешних " на '
но читается это всеравно очень тяжело:

try_files_bypass '$http_cookie ~* "id=([^;]+)(?:;|$)"';

потому что все что внутри "таких" или 'таких' кавычек
автоматически воспринимается программистами как строка,
а не как условное выражение, которое должно вычисляться.

вариант $( ... ) очень похож на if( ... ) он проще в восприятии,
тем более, что конструкция $( ... ) есть в bash и означает выполнение
выражения в скобках, в конфиге nginx это читалось бы аналогично,
тем более что ${ ... } и в bash и в nginx означает одно и то же.

самое главное преимущество: для переменных $( ... ) не нужно
делать скрытых locations, как сейчас для if( ... ) { ... }.

P.S. синтаксис функций и логических операций в виде

$and( $( $request_method = POST ), $( $server_protocol = "HTTP/1.0" ) )

- это один из возможных вариантов развития в будущем,
реализовывать это прямо сейчас я не предлагаю.

-- 
Best regards,
  Gena




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