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