nginx serve o último download

2

em um site que hospedo eu tenho um nginx configurado como servidor http principalmente para conteúdo estático. Alguns conteúdos que obtêm serverd são, na verdade, downloads de software (coisas do setup.exe). O que eu quero fazer é de alguma forma obter o nginx para servir o pacote de download mais recente em um URL estático. Para que o link leve ao download do myapp-setup-1.0.msi, desde que o myapp-setup-1.0.msi seja o mais novo arquivo no respectivo diretório de conteúdo.

Eu tentei implementar isso usando o symlinks, mas surge o problema de que é necessário definir um cabeçalho apropriado (Content-Disposition) contendo o nome do arquivo exibido pelo navegador e não sei como obter o nome do arquivo alvo de um symlink de dentro da configuração do nginx. Eu acho que isso pode não ser possível.

Aqui está a configuração até agora:

server {

    listen   80;

    server_name www.example.com example.com;

    access_log  /var/log/nginx/download.access.log;

    location /download/ {
      alias /var/www/download/;
      default_type application/octet-stream;
    }

    location /download/myapp/ {
      alias /var/www/download/myapp/;
      index latest.msi;
      default_type application/octet-stream;
      if ($request_filename ~* ^.*/([^/]*?)$) {
        set $exits true;
        set $msi $1;
      }
      if ($msi = latest.msi) {
        set $msi "myapp-setup-1.0.msi";
      }
      if ($exits) {
        add_header Content-Disposition: "attachment; filename=$msi";
      }
    }

}

Note que latest.msi é um link simbólico que aponta para myapp-setup-1.0.msi.

Então, alguma idéia sobre como implementar um download do arquivo mais recente por uma URL estática com o nginx? Ou faz mais sentido usar algum tipo de script cgi para essa situação?

EDITAR :

Eu fui com o módulo perl de inserção, como o DrGkill sugeriu, e o seguinte snippet de perl curto:

perl_set $link_target '
  sub {
        my $r = shift;
        my $filename = $r->filename;
        if (-l $filename) {
          return readlink $filename;
        } else {
          return "";
        }
   }
  ';
    
por aeisele 26.08.2011 / 12:35

1 resposta

1

Você pode testar uma mistura entre a declaração try_files :

link

e if_modified_since declaração:

link

Finalmente, o módulo Embedded Perl pode retornar o nome do arquivo mais recente em um diretório com mais opções.

link

    
por 26.08.2011 / 13:15

Tags