是否可以使用lighttpd拦截对不存在的文件的请求?

时间:2010-01-25 13:34:35

标签: caching cgi lighttpd

是否可以配置lighttpd ,以便在文件存在时对文件的请求成功,但是如果文件不存在则处理和重定向,例如到cgi脚本? / p>

我想要实现的是在磁盘上拥有一组由脚本生成并直接提供的图像文件。根据请求,如果文件不存在,脚本将生成映像并将其保存到磁盘(以备将来请求),然后直接提供映像或重定向回相同的URL,这次将成功。我基本上是将生成的输出缓存在磁盘上。

我目前有一个原型,脚本总是处理请求,读取并回显文件(如果存在),但我宁愿节省开销,并且如果可能的话,让lighttpd直接提供它。

3 个答案:

答案 0 :(得分:1)

你可以拥有两全其美。如果你给它一个

,Lighttpd将为该文件提供服务
X-Sendfile: path to file

见:http://redmine.lighttpd.net/wiki/1/X-LIGHTTPD-send-file。文档页面上有一个php示例。

答案 1 :(得分:1)

您可以设置:

server.error-handler-404 

配置脚本的选项,它将执行您想要的操作。

请参阅http://redmine.lighttpd.net/wiki/1/Server.error-handler-404Details

答案 2 :(得分:0)

这个问题可能很老了,但它问的正是我想要的答案。这是我想出的解决方案...

这是 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 = ( "" => "" )
}

它位于我存储包文件的服务器上。它直接提供它拥有的任何文件,并请求任何它没有委托给一个名为 /bin/fecher 的 CGI 脚本。

如果服务器遇到与缺少文件的第一个表达式匹配的 URL,则该 URL 将被重写并映射到执行的 CGI 脚本。

在我的服务器 /bin/fecher 上是一个 shell 脚本,它从上游拉取丢失的包,将其返回给客户端并将其存储在本地以备将来请求。