captures in regex location

Igor Sysoev is at rambler-co.ru
Thu Mar 5 22:43:13 MSK 2009


On Thu, Mar 05, 2009 at 10:34:51PM +0300, Vladimir Sopot wrote:

> Mot*^&@W$ ;".%($ :^?:(;!
> 
> Спасибо, действительно, надо обращать больше внимания на имена файлов  
> и места сохранения аттачей.
> 
> Но всплыл другой непонятный "фич" -
> 
> server {
>         server_name ~^([bos])(\d)p\.site;
>         root    /wwwroot/site/$2/$1/;
>         }
> 
> работает отлично. Но как только внутри, после root ... появляется
> 
> 	if ($request_uri ~* upic.jpg) {
> 		# не важно что, хотя бы даже пустота
> 		}
> 
> всё снова ломается :(

regex в if/rewrite меняют captures, даже если они не сработали.
Несовпавший location regex не трогает captures. Поэтому нужно переходить
на прогрессивные технологии:

location ~* upic\.jpg {
   ...
}

> P.S. спасибо за ненужную "|" :)
> 
> On Mar 5, 2009, at 6:56 PM, Igor Sysoev wrote:
> 
> >On Thu, Mar 05, 2009 at 06:46:03PM +0300, Vladimir Sopot wrote:
> >
> >>В эту сторону я уже думал и на такой location - ругается, да.
> >>
> >>Но патч вроде ложится -
> >>
> >>nginx-0.7.39/src/http # patch -p2 <patch.location_captures
> >
> >Это первый патч, нужен patch.location_captures1
> >
> >>patching file ngx_http_core_module.c
> >>patching file ngx_http_request.h
> >>patching file ngx_http_script.c
> >>patching file ngx_http_script.h
> >>patching file modules/ngx_http_rewrite_module.c
> >>
> >>и objs/nginx получается другого размера, если без патча.
> >>
> >>On Mar 5, 2009, at 5:30 PM, Igor Sysoev wrote:
> >>
> >>>On Thu, Mar 05, 2009 at 05:22:43PM +0300, Vladimir Sopot wrote:
> >>>
> >>>>Увы,
> >>>>
> >>>>2009/03/05 16:54:16 [error] 18720#0: *5440 open() "/wwwroot/ 
> >>>>site///e/
> >>>>ea/0/12720.jpg" failed (2: No such file or directory),
> >>>>client: 94.188.35.148, server: ~^(s)(\d)\.site, request: "GET /e/ 
> >>>>ea/
> >>>>0/12720.jpg HTTP/1.1", host: "s0.site", referrer:
> >>>>"http://site/ea/12720.html"
> >>>>
> >>>>Тоесть сервер точно матчится, но вот $1-2 не устанавливаются :(
> >>>>
> >>>>Куда бы еще копнуть? Уж больно хочется и конфиг порезать и на
> >>>>регекспах сэкономить :)
> >>>
> >>>А патч точно приложен ?
> >>>Что показывает nginx, если в конфиг добавить такое:
> >>>
> >>> location ~ \.TXT$ {
> >>>     alias  /wwwroot/;
> >>> }
> >>>
> >>>?
> >>>
> >>>># uname -a
> >>>>Linux site 2.6.27.7-9-default #1 SMP 2008-12-04 18:10:04 +0100  
> >>>>x86_64
> >>>>x86_64 x86_64 GNU/Linux
> >>>>
> >>>># ./configure \
> >>>> --with-http_stub_status_module \
> >>>> --without-mail_pop3_module \
> >>>> --without-mail_imap_module \
> >>>> --without-mail_smtp_module \
> >>>> --without-http_access_module \
> >>>> --without-http_autoindex_module \
> >>>> --without-http_browser_module \
> >>>> --without-http_charset_module \
> >>>> --without-http_limit_zone_module \
> >>>> --without-http_map_module \
> >>>> --without-http_memcached_module \
> >>>> --without-http_referer_module \
> >>>> --without-http_ssi_module \
> >>>> --without-http_userid_module \
> >>>> --without-http_proxy_module \
> >>>> --without-http_proxy_module
> >>>>...........
> >>>>checking for PCRE library ... found
> >>>>...........
> >>>>Configuration summary
> >>>>+ using system PCRE library
> >>>>...........
> >>>># pcre-config --version
> >>>>7.8
> >>>>
> >>>>On Mar 5, 2009, at 4:14 PM, Igor Sysoev wrote:
> >>>>
> >>>>>On Thu, Mar 05, 2009 at 03:46:55PM +0300, Vladimir Sopot wrote:
> >>>>>
> >>>>>>Помимо описанного сервера есть еще секции
> >>>>>>
> >>>>>>server {
> >>>>>>   server_name ~^([b|o])(\d)\.site;
> >>>>>>	.......
> >>>>>>	}
> >>>>>>
> >>>>>>server {
> >>>>>>   listen *:80 default bind sndbuf=64k;
> >>>>>>   server_name site
> >>>>>>	..........
> >>>>>>	}
> >>>>>>
> >>>>>>и добавление пустого сервера не исправило ситуацию.
> >>>>>
> >>>>>У меня для
> >>>>>
> >>>>>server {
> >>>>>   listen  8000;
> >>>>>   server_name ~^([b|o])(\d)z\.site;
> >>>>>
> >>>>>   root    /wwwroot/site/$1/$2/;
> >>>>>}
> >>>>>
> >>>>>в логах такая ошибка:
> >>>>>
> >>>>>[error] 58504#0: *1 open() "/wwwroot/site/b/1/dir/index.html"  
> >>>>>failed
> >>>>>(2: No such file or directory), client: 127.0.0.1, server: ~^([b| 
> >>>>>o])
> >>>>>(\d)z\.site, request: "GET /dir/index.html HTTP/1.0", host:
> >>>>>"b1z.site"
> >>>>>
> >>>>>То есть, путь "/wwwroot/site/b/1/dir/index.html" формиурется
> >>>>>правильно.
> >>>>>
> >>>>>Кстати, "|" в "([b|o])" - лишняя.
> >>>>>
> >>>>>>On Mar 5, 2009, at 2:43 PM, Igor Sysoev wrote:
> >>>>>>
> >>>>>>>On Thu, Mar 05, 2009 at 01:57:49PM +0300, Vladimir Sopot wrote:
> >>>>>>>
> >>>>>>>>Спасибо, но что-то оно не того
> >>>>>>>>
> >>>>>>>>server {
> >>>>>>>> server_name ~^([b|o])(\d)z\.site;
> >>>>>>>>
> >>>>>>>>#        if ($host ~* (.)(\d)) {
> >>>>>>>>     set $store_type $1;
> >>>>>>>>     set $store_id $2;
> >>>>>>>>#            }
> >>>>>>>>
> >>>>>>>> root    /wwwroot/site/$store_id/$store_type/;
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>>В таком виде не работает (404), если убрать комментарии - все
> >>>>>>>>становится на свои места. Забрать root внутрь location / { }  
> >>>>>>>>тоже
> >>>>>>>>ничего не дает. root  /wwwroot/site/$2/$1/ тоже не работает
> >>>>>>>
> >>>>>>>Скорее всего, regex вообще не исполняется, потому что сервер
> >>>>>>>один -
> >>>>>>>проверять нечего. Нужно добавить пустой сервер, чтобы nginx  
> >>>>>>>начал
> >>>>>>>проверять
> >>>>>>>server_name:
> >>>>>>>
> >>>>>>>server { server_name _; }
> >>>>>>>
> >>>>>>>>On Mar 5, 2009, at 1:17 PM, Igor Sysoev wrote:
> >>>>>>>>
> >>>>>>>>>On Thu, Mar 05, 2009 at 12:14:55PM +0200, Andrew Sitnikov  
> >>>>>>>>>wrote:
> >>>>>>>>>
> >>>>>>>>>>>>А можно такое же ещё и для server_name?
> >>>>>>>>>>IS> Новый патч с поддержкой server_name.
> >>>>>>>>>>можно пример ?
> >>>>>>>>>
> >>>>>>>>>Наверное, как-то так:
> >>>>>>>>>
> >>>>>>>>>server {
> >>>>>>>>>listen  8000;
> >>>>>>>>>server_name  ~^(?:www\.)?(.+)$;
> >>>>>>>>>
> >>>>>>>>>location / {
> >>>>>>>>>    root   /path/to/$1;
> >>>>>>>>>}
> >>>>>>>>>}
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>-- 
> >>>>>>>>>Игорь Сысоев
> >>>>>>>>>http://sysoev.ru
> 

-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list