Re: $1 в post_action

drmarker drmarker at gmail.com
Tue May 30 16:58:36 MSD 2006


Отлично, работает, большое спасибо.

При этом $token будет жить только внутри конкретно этого реквеста?

Я чуть "упростил конфиг" и получилось вот что:

server {
    listen 80 default;

    server_name distrib;

    location / {
        if ($uri ~ '^/([[:xdigit:]]{32})/(.+)$') {
            set $token $1;
            set $file  $2;

            rewrite ^ /cgi-bin/download-start.pl?to=$token&fi=$file last;
        }
    }

    location /cgi-bin/ {
        proxy_pass http://auth:8008/cgi-bin/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /files {
        internal;

        root /srv/movdb;

        post_action /download-stop;
    }

    location /download-stop {
        internal;

        rewrite ^ /cgi-bin/download-stop.pl?to=$token&bs=$body_bytes_sent last;
    }

}

Все правильно с точки зрения политики партии?

В твоем примере стоит `?` после $body_bytes_sent? Typo?

On 5/30/06, Igor Sysoev <is at rambler-co.ru> wrote:
> On Tue, 30 May 2006, drmarker wrote:
>
> > On 5/30/06, Igor Sysoev <is at rambler-co.ru> wrote:
> >> On Tue, 30 May 2006, drmarker wrote:
> >>
> >> > Возможна ли такая конструкция:
> >> >
> >> >   location / {
> >> >       rewrite '^/(token)/(.+)$'
> >> >           /cgi-bin/download-start.pl?to=$1&fi=$2 last;
> >> >
> >> >       post_action /cgi-bin/download-stop.pl?to=$1&bs=$body_bytes_sent;
> >> >   }
> >> >
> >> > Ключевое тут - использование подстановки $1в post_action.
> >> >
> >> > Если так нельзя, то как можно? Например, так?
> >> >
> >> > post_action /cgi-bin/download-stop.pl?uri=$uri&bs=$body_bytes_sent;
> >> >
> >> > ?
> >>
> >>         ...
> >>         post_action /cgi-bin/download-stop.pl;
> >>      }
> >>
> >>      location = /cgi-bin/download-stop.pl {
> >>         rewrite  ^
> >> /cgi-bin/download-stop.pl?uri=$uri&bs=$body_bytes_sent?
> >>                      break;
> >>
> >>         proxy_pass  ...;
> >>      }
> >>
> >
> > Тут задача в том, чтобы в download-stop.pl уходил token (см. мой кусок
> > конфига), а при предложенной тобой схеме в $uri он не попадает.
> >
> > Вот конфиг полностью:
> >
> > server {
> >   listen 80 default;
> >
> >   location / {
> >       rewrite '^/([[:xdigit:]]{6})/(.+)$'
> >           /cgi-bin/download-start.pl?to=$1&fi=$2 last;
> >   }
> >
> >   location /cgi-bin/ {
> >       proxy_pass http://auth:8008/cgi-bin/;
> >       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> >   }
> >
> >   location /files {
> >       internal;
> >
> >       root /srv/movdb;
> >
> >       post_action /cgi-bin/download-stop.pl;
> >   }
> >
> >   location = /cgi-bin/download-stop.pl {
> >       rewrite ^ /cgi-bin/download-stop.pl?uri=$uri&bs=$body_bytes_sent
> > break;
> >
> >       proxy_pass http://auth.movdb.mine.nu:8008/cgi-bin/;
> >       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
> >   }
> > }
> >
> > Мне нужно следующее:
> >
> > 1) пользователь запрашивает "/ffffff/file.ext"; (ffffff - пример,
> > изменяется).
> > 2) download-start.pl проверяет "ffffff" по базе и отдает internal redirect;
> > 3) nginx отдает file.ext по этому редиректу;
> > 4) после завершения сессии вызывается
> > download-stop.pl?to=ffffff&bs=$body_bytes_sent;
> >
> > Как это сделать?
> >
> > Сессии в базе учитываются по token (ffffff в примере), а не по адресу
> > и имени файла, например.
>
> Тогда так:
>
>      location / {
>          if ($uri ~ ^/([[:xdigit:]]{6})/(.+)$) {
>              set  $token  $1;
>              rewrite '^/([[:xdigit:]]{6})/(.+)$'
>                  /cgi-bin/download-start.pl?to=$1&fi=$2 last;
>          }
>      }
>
>      location = /cgi-bin/download-stop.pl {
>          rewrite  ^  /cgi-bin/download-stop.pl?to=$token&bs=$body_bytes_sent?
>                   break;
>
>
> Игорь Сысоев
> http://sysoev.ru
>
>


More information about the nginx-ru mailing list