Welcome! Log In Create A New Profile

Advanced

Re: try_files_bypass

Gena Makhomed
August 05, 2010 07:12PM
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 mailing list
nginx-ru@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

try_files_bypass

Igor Sysoev August 03, 2010 10:02AM

Re: try_files_bypass

Gena Makhomed August 03, 2010 01:52PM

Re: try_files_bypass

Igor Sysoev August 03, 2010 01:58PM

Re: try_files_bypass

Gena Makhomed August 05, 2010 07:12PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 196
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready