在我托管的网站上,我设置了一个 nginx 作为 http 服务器,主要用于静态内容。一些被服务器处理的内容实际上是软件下载(setup.exe 之类的东西)。我想要做的是以某种方式让 nginx 为最新下载包到静态 URL 下。这样http://www.example.com/download/myapp只要 myapp-setup-1.0.msi 是相应内容目录中的最新文件,就会导致下载 myapp-setup-1.0.msi。
我尝试使用符号链接来实现这一点,但随后出现了一个问题,即必须设置一个包含浏览器显示的文件名的适当标头(Content-Disposition),而我不知道如何从 nginx 配置中获取符号链接的目标文件名。我认为这可能是不可能的。
到目前为止的配置如下:
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";
}
}
}
请注意,latest.msi 是一个指向 myapp-setup-1.0.msi 的符号链接。
那么,关于如何使用 nginx 通过静态 URL 下载最新文件,您有什么想法吗?或者在这种情况下使用某种 cgi 脚本更有意义吗?
答案1
您可以测试以下语句的混合try_files
:
http://wiki.nginx.org/HttpCoreModule#try_files
和if_modified_since
声明:
http://wiki.nginx.org/HttpCoreModule#if_modified_since
最后,嵌入式 Perl 模块可以使用更多选项返回目录中最新文件的名称。
答案2
以下是原始发帖人对该问题的编辑:
我按照 DrGkill 的建议使用了嵌入的 perl 模块以及以下简短的 perl 代码片段:
perl_set $link_target '
sub {
my $r = shift;
my $filename = $r->filename;
if (-l $filename) {
return readlink $filename;
} else {
return "";
}
}
';