Использование rewrite переменных для дальнейших операций

Igor Sysoev is at rambler-co.ru
Tue Apr 18 15:04:31 MSD 2006


On Tue, 18 Apr 2006, Eugene wrote:

> Для обхода прокси, запрещающих скачивание использую следующую схему с 
> обращением расширений
>
> location / {
>           root   html;
>           index  index.html index.htm;
>           autoindex on;
>           if (!-f $request_filename) {
>              rewrite ^(/.+)?/([^/]+)\.(.)(.)(.)(.?)$ /$1/$2.$6$5$4$3 last;
>              #add_header Content-Disposition 'attachment; 
> filename=$2.$6$5$4$3';
>              add_header Content-Type application/octet-stream;
>           }
>           if ($slownet) {
>             limit_rate 3k;
>           }
>
> т.е. /dir/file.3pm  -->  /dir/file.mp3
>
> Есть желание выдавать оригинаьное имя файла в заголовке, для этого прописываю 
> его в rewrite,
> но заголовок не возвращается.
> Однако если зайти по адресу / то предлагает скачать страницу и выдает 
> заголовок
> content-disposition: attacmhent; filename=.
>
> Где грабли?

Проблема в том, что большинство директив статические (декларативные),
а исполняются только директивы ngx_http_rewrite_module.
http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#internals

В данном случае происходит следующее:

Если файла нет, то выполяняется rewrite и опять ищется location (из-за last).
В новой конфигурации директив add_header уже нет.

Вот такое должно работать:

location ~ /$ {
          root   html;
          index  index.html index.htm;
          autoindex on;
}

location / {
          root   html;
          index  index.html index.htm;

          uninitialized_variable_warn off;

          if (!-f $request_filename) {
               rewrite ^(/.+)?/([^/]+)\.(.)(.)(.)(.?)$ /$1/$2.$6$5$4$3;
               set   $name  $2.$6$5$4$3;
          }

          if ($slownet) {
              limit_rate 3k;
          }

          add_header Content-Disposition 'attachment; filename=$name';
          add_header Content-Type application/octet-stream;
}


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list