lighttpd 1.4.46+ обслуживает определенный файл на основе $HTTP

lighttpd 1.4.46+ обслуживает определенный файл на основе $HTTP

У меня есть сервер lighttpd версии 1.4.46+ на Linux, который обслуживаетфайл1.xmlифайл2.xmlотhtdocsкаталог как есть. Есть клиенты, которые запрашивают эти файлы, каждый из них отправляетПользователь-агентзаголовок на сервер, который имеет форматМое приложение 12345где12345это клиентская версия.

Мне нужно проанализировать номер версии.12345и служить либофайл1.xmlилифайл2.xml, в зависимости от номера версии клиента.файл1.xmlнеобходимо предоставить клиентам с номером версии ниже11255ифайл2.xmlнеобходимо предоставить клиентам номер версии11255и выше, и наоборот.

Как проще всего это сделать? Предпочтительноизбегать перенаправлений, и желательноизбегайте сценариев оболочки или Perlвовлечены, если возможно. Избегать перенаправлений - этонаивысший приоритет, при этом использование скрипта находится наболее низкий приоритет.

Есть ли среди вас гуру Lighttpd, которые могли бы мне помочь?

Я попробовал регулярное выражение в стиле Perl (=~)$HTTP["useragent"]и установление условныхсервер.документ-кореньккорневой_сервер + "/htdocs/file1"или"/htdocs/file2"которые включают оба файла, но не удались.

Я хотел попробоватьвключить_оболочку, но не уверен, как передать аргументы скрипту, который мог бы обрабатывать номер версии и, возможно, записать файл конфигурации include на основе результатов. Я мог бы, возможно, добавить условия if для номеров версий1-11254служитьфайл1.xmlно этот список условий станет очень большим, что выглядит неправильно.

решение1

Вы можете использовать lighttpdmod_magnetи несколько строк пользовательского кода lua.

local r = lighty.r
if r.req_attr["physical.path"] == "/path/to/htdocs/file.xml" then
  local ver = string.match(r.req_header["User-Agent"], "MyApp (%d+)")
  local path = string.sub(r.req_attr["physical.path"], 1, -4)   -- remove '.xml'
  if ver and ver > 12345 then
    r.req_attr["physical.path] = path .. "2.xml"
  else
    r.req_attr["physical.path] = path .. "1.xml"
  end
  r.resp_header["Vary"] = "User-Agent"
end
return 0

Вышеизложенное не тестировалось и применимо к lighttpd 1.4.60 или более поздней версии. Текущая версия lighttpd — lighttpd 1.4.69. Если вы используете lighttpd 1.4.46, то, скорее всего, ваши системы плохо обслуживаются и сильно устарели, но вы можете найти информацию о старых интерфейсах lighttpd mod_magnet в том же документе: lighttpdmod_magnet

Связанный контент