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

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

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

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


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


Ответы (3)


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

X-Sendfile: path to file

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

person Kyle Butt    schedule 25.01.2010

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

server.error-handler-404 

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

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

person Perry    schedule 17.03.2010

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

Вот полный и минимальный рабочий файл конфигурации для 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