captures in regex location

Vladimir Sopot jd at artdesign.ru
Fri Mar 6 00:15:28 MSK 2009


On Mar 5, 2009, at 11:37 PM, Igor Sysoev wrote:

> On Thu, Mar 05, 2009 at 11:30:14PM +0300, Vladimir Sopot wrote:
>
>> А-ха!
>>
>> В моем if-е подразумевался break, чтобы больше условий (типа проверки
>> географии и пр.) в этом server-е не выполнялось. Что должно быть
>> внутри нового location-а для того же функционала?
>
> Как выглядят if'ы ?

Наверняка, что-то не так с last-break, но работает :)

        if ($request_uri ~* upic.jpg) {
            break;
            }

	if (!-f $request_filename) {
             rewrite "^(................)$"   http://$2$3$4      last;
             return 404;
             }

         if ($country = EN) {
             rewrite (.*)        http://somewhere.com$1 break;
             }

>> 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
>>>
>>>
>>
>
> -- 
> Игорь Сысоев
> http://sysoev.ru
>
>






More information about the nginx-ru mailing list