Re: $1 в post_action
Igor Sysoev
is at rambler-co.ru
Tue May 30 16:30:49 MSD 2006
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