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