Можно ли перехватить запрос несуществующего файла с помощью lighttpd?

Можно ли настроить lighttpd таким образом, чтобы запрос файла выполнялся успешно, если файл существует, но обрабатывался и перенаправлялся, например, на сценарий cgi, если файл не существует?

Чего я пытаюсь добиться, так это иметь на диске набор файлов изображений, которые генерируются сценарием и обслуживаются напрямую. По запросу, если файл не существует, скрипт сгенерирует изображение и сохранит его на диск (для будущих запросов), а затем либо обработает изображение напрямую, либо перенаправит обратно на тот же URL-адрес, что на этот раз будет успешным. По сути, я кэширую сгенерированный вывод на диск.

В настоящее время у меня есть прототип, в котором скрипт всегда обрабатывает запрос, читая и отображая файл, если он существует, но я бы предпочел сэкономить накладные расходы и позволить lighttpd обслуживать его напрямую, если это возможно.


person Joe    schedule 25.01.2010    source источник


Ответы (3)


arrow_upward
1
arrow_downward

Вы можете получить лучшее из обоих миров. Lighttpd будет обслуживать файл, если вы дадите ему

X-Sendfile: path to file

см.: http://redmine.lighttpd.net/wiki/1/X-LIGHTTPD-send-file. На странице документации есть пример php.

person Kyle Butt    schedule 25.01.2010

arrow_upward
1
arrow_downward

Вы можете установить:

server.error-handler-404

config в скрипт, который будет делать то, что вы хотите.

см. http://redmine.lighttpd.net/wiki/1/Server.error-handler-404Details

person Perry    schedule 17.03.2010

arrow_upward
0
arrow_downward

Этот вопрос может быть старым, но он задал именно то, на что я хотел получить ответ. Вот решение, которое я придумал...

Вот полный и минимальный рабочий файл конфигурации для Lighttpd.

server.document-root = "/srv/http"
server.port = 80
server.username = "nobody"
server.groupname = "nobody"
server.dir-listing = "enable"
server.stream-response-body = 2
server.modules = (
  "mod_rewrite",
  "mod_alias",
  "mod_cgi"
)
url.rewrite-if-not-file = ( "^/alpine/.*\.apk$" => "/fecher" )
alias.url += ( "/fecher"   => "/bin/fecher" )
$HTTP["url"] =~ "^/fecher$" {
    cgi.assign = ( "" => "" )
}

Это находится на сервере, где я храню файлы пакетов. Он напрямую обслуживает любые файлы, которые у него есть, и запросы на все, что ему не нужно, делегируется сценарию CGI с именем /bin/fecher.

Если сервер встречает URL-адрес, соответствующий первому выражению, для которого ему не хватает файла, URL-адрес перезаписывается и сопоставляется с исполняемым сценарием CGI.

На моем сервере /bin/fecher есть сценарий оболочки, который извлекает недостающий пакет из восходящего потока, возвращает его клиенту и сохраняет локально для будущих запросов.

person starfry    schedule 02.07.2021