ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: $1 в post_action



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

При этом $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@xxxxxxxxxxxxx> wrote:
On Tue, 30 May 2006, drmarker wrote:

> On 5/30/06, Igor Sysoev <is@xxxxxxxxxxxxx> 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




 




Copyright © Lexa Software, 1996-2009.