Nginx 使用目标文件名提供符号链接

Nginx 使用目标文件名提供符号链接

在我托管的网站上,我设置了一个 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 模块可以使用更多选项返回目录中最新文件的名称。

http://wiki.nginx.org/EmbeddedPerlModule

答案2

以下是原始发帖人对该问题的编辑:

我按照 DrGkill 的建议使用了嵌入的 perl 模块以及以下简短的 perl 代码片段:

perl_set $link_target '
  sub {
        my $r = shift;
        my $filename = $r->filename;
        if (-l $filename) {
          return readlink $filename;
        } else {
          return "";
        }
   }
  ';

相关内容