是否可以配置 lighttpd以便在文件存在时对文件的请求成功,但在文件不存在时被处理和重定向,例如到 cgi 脚本?
我想要实现的是在磁盘上有一组由脚本生成并直接提供的图像文件。在请求中,如果文件不存在,脚本将生成图像并将其保存到磁盘(用于将来的请求),然后直接提供图像或重定向回相同的 URL,这一次将成功。我本质上是在磁盘上缓存生成的输出。
我目前有一个原型,其中脚本始终处理请求,读取并回显文件(如果存在),但我宁愿节省开销并尽可能让 lighttpd 直接提供服务。
你可以两全其美。如果你给它一个 Lighttpd 将提供文件
X-Sendfile: path to file
见:http ://redmine.lighttpd.net/wiki/1/X-LIGHTTPD-send-file 。文档页面上有一个 php 示例。
您可以设置:
server.error-handler-404
脚本的配置选项,它将执行您想要的操作。
见http://redmine.lighttpd.net/wiki/1/Server.error-handler-404Details
这个问题可能很老,但它确切地问了我想要回答的问题。这是我想出的解决方案...
这是 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
.
url.rewrite-if-not-file
匹配的任何 URL 重写为./fecher
/fecher
的别名(更改其文档根目录)为/bin/fecher
.^/fecher$
(即仅/fecher
)。/var/tmp
或其他任何地方的写访问权限)。如果服务器遇到与缺少文件的第一个表达式匹配的 URL,则 URL 将被重写并映射到执行的 CGI 脚本。
在我的服务器/bin/fecher
上是一个 shell 脚本,它从上游提取丢失的包,将其返回给客户端并将其存储在本地以供将来请求。