Você pode testar uma mistura entre a declaração try_files
:
e if_modified_since
declaração:
Finalmente, o módulo Embedded Perl pode retornar o nome do arquivo mais recente em um diretório com mais opções.
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 "";
}
}
';