ПРОЕКТЫ 


  АРХИВ 


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



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.