Настройка размещения контента на основе URL / nginx

Имея nginx, обслуживающий статические файлы с URL-адресом, например http://foobar.tld/<random_dir>/<file_md5sum_as_filename>, и я хотел бы, если я укажу в конце URL-адреса ?f="filename.filetype" - nginx проанализирует эту строку запроса в конце (если указано) и подготовит новый контент, располагающий соответствующими указанными аргументами, и без какого-либо динамического бэкэнда, который вроде невозможно.

или экземпляр http://foobar.tld/<random_dir>/<file_md5sum_as_filename>?f="foobar.pdf"

Можно ли сделать что-то подобное с модулем nginx/lua? Есть ли у кого-нибудь полезный пример или он сделал что-то подобное?


person lowk3y    schedule 29.11.2012    source источник
comment
Позвольте мне перефразировать ваш вопрос, чтобы убедиться, что я правильно его понял. Вы хотите, чтобы пользователь загрузил файл с именем foobar.pdf или каким-либо другим параметром, установленным в качестве параметра f, из локального файла с именем <nginx_root>/random_dir/md5sum?   -  person Mickaël Le Baillif    schedule 29.11.2012
comment
в обоих случаях вы получаете контент из <nginx_root>/random_dir/md5sum, но во втором случае, когда вы устанавливаете параметр ?f=, nginx устанавливает расположение содержимого, а также указываете имя файла из значений параметров.   -  person lowk3y    schedule 29.11.2012


Ответы (2)


Это действительно возможно с nginx-lua; в частности, директива header_filter_by_lua.

Что-то вроде следующего должно помочь:

location / {
  header_filter_by_lua '
    local args = ngx.req.get_uri_args()
    if not args.f then return end

    ngx.header["Content-Disposition"] = "attachment; filename=" .. args.f
  ';
}
person furq    schedule 30.11.2012
comment
Ура! Это то, что я искал. 10x - person lowk3y; 30.11.2012

Чистая конфигурация Nginx

location / {
  if ($arg_f) {
    add_header Content-Disposition "attachment; filename=$arg_f";
  }
}
person Alexander Azarov    schedule 30.11.2012
comment
Да, это ванильная конфигурация Nginx - person Alexander Azarov; 30.11.2012