captures in regex location

Vladimir Sopot jd at artdesign.ru
Thu Mar 5 23:30:14 MSK 2009


А-ха!

В моем if-е подразумевался break, чтобы больше условий (типа проверки  
географии и пр.) в этом server-е не выполнялось. Что должно быть  
внутри нового location-а для того же функционала?

On Mar 5, 2009, at 10:43 PM, Igor Sysoev wrote:

> 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