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
|