ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: try_files_bypass



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@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.