Назад | Перейти на главную страницу

nginx обслуживает последнюю загрузку

на веб-сайте, который я размещаю, у меня есть nginx, настроенный как http-сервер в основном для статического контента. Некоторый контент, который получает serverd, на самом деле является загрузкой программного обеспечения (файл 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.

Итак, есть идеи о том, как реализовать загрузку последней версии файла по статическому URL-адресу с помощью nginx? Или имеет смысл использовать какой-нибудь cgi-скрипт для этой ситуации?


РЕДАКТИРОВАТЬ:

Я использовал встроенный модуль perl, как предлагал DrGkill, и следующий короткий фрагмент кода perl:

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

Вы можете проверить смесь между утверждениями try_files :

http://wiki.nginx.org/HttpCoreModule#try_files

и if_modified_since заявление :

http://wiki.nginx.org/HttpCoreModule#if_modified_since

Наконец, модуль Embedded Perl может вернуть имя последнего файла в каталоге с дополнительными параметрами.

http://wiki.nginx.org/EmbeddedPerlModule