【问题标题】:Is possible to intercept a request for a nonexistent file with lighttpd?是否可以使用 lighttpd 拦截对不存在文件的请求?
【发布时间】:2010-01-25 13:34:34
【问题描述】:

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

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

我目前有一个原型,其中脚本始终处理请求、读取和回显文件(如果存在),但我宁愿节省开销并尽可能让 lighttpd 直接提供它。

【问题讨论】:

    标签: caching cgi lighttpd


    【解决方案1】:

    您可以两全其美。如果您给它一个文件,Lighttpd 将提供该文件

    X-Sendfile: path to file
    

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

    【讨论】:

      【解决方案2】:

      您可以设置:

      server.error-handler-404 
      

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

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

      【讨论】:

        【解决方案3】:

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

        这是一个完整的、最小的 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 脚本,它从上游提取丢失的包,将其返回给客户端并将其存储在本地以供将来请求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-09
          • 2014-08-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多