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