项目

通用

个人资料

操作

配置语法

概览

lighttpd 配置语法是基础的,许多配置都可以简单地用配置语法表达。

然而,配置语法并非一种完整的编程语言,它也无意于此。对于任何复杂的逻辑,建议创建生成 lighttpd 配置语法作为输出的脚本。

基本语法的BNF类表示法

  option   : NAME = VALUE
  merge    : NAME += VALUE
  replace  : NAME := VALUE    (replace/overwrite earlier value) (since 1.4.46)
  NAME     : modulename.key
  VALUE    : ( <string> | <integer> | <boolean> | <array> | VALUE [ + VALUE ]*)
  INCLUDE  : "include" <string>
  INCLUDE_SHELL : "include_shell" <string>

  <string> : '"' [text] '"'           (can be constructed from multiple stringifiable values: VALUE [ + VALUE ]*)
  <integer>: digit+
  <boolean>: ( "enable" | "disable" | 1 | 0 )
  <array>  : "(" [ [ <string> "=>" ] <value>, ]* ")" 
    (key => value) list : "(" [ <string> "=>" <value>, ]* ")" 
    value list          : "(" [               <value>, ]* ")" 

   LOCAL_VARIABLE      : "var." NAME
                       : "var." NAME ( = | += | := ) VALUE
   ENVIRONMENT_VARIABLE: "env." NAME    (lighttpd.conf environment at startup)

示例

  # default document-root
  server.document-root = "/var/www/example.org/pages/" 

  # TCP port
  server.port = 80

  # selecting modules
  server.modules = ( "mod_access", "mod_rewrite" )

  # variables, computed when config is read.
  var.mymodule = "foo" 
  server.modules += ( "mod_" + var.mymodule )
  # var.PID is initialised to the pid of lighttpd before config is parsed

  # include, relative to dirname of main config file
  include "mime.types.conf" 

  # read configuration from output of a command
  include_shell "/usr/local/bin/custom-create-mime.conf.pl /etc/mime.types" 

条件配置

大多数(非全局)选项可以使用以下语法(包括嵌套)进行条件配置。

  <field> <operator> <value> {  # (since 1.4.74, may be preceded by literal "if")
    ...
    <field> <operator> <value> {
      ... nesting: match only when parent match
    }
  }
  else <field> <operator> <value> { # (since 1.4.74, "elif", "elsif", "elseif", or "else if" are also accepted in lieu of "else")
    ... the "elseif" block
  }
  else { # (since 1.4.46)
    ... the "else" block
  }

其中 <field> 是以下之一

字段名称 描述
$REQUEST_HEADER["..."] 匹配任意 HTTP 请求头(不区分大小写)(自 1.4.46 起)
$HTTP["request-method"] 匹配请求方法(自 1.4.19 起)
$HTTP["scheme"] 匹配传入连接使用的方案。可以是“http”或“https”(自 1.4.19 起)
$HTTP["host"] 匹配主机
$HTTP["url"] 匹配 URL 路径(不包括主机或查询字符串)
$HTTP["querystring"] 匹配查询字符串,例如在此类 URL 中问号后的部分:index.php?module=images...
$HTTP["remoteip"] 匹配远程 IP 地址或远程网络 ==!= CIDR 掩码(自 1.4.40 起支持 IPv6)
$HTTP["cookie"] (自 1.4.46 起被 $REQUEST_HEADER["Cookie"] 取代)匹配 Cookie
$HTTP["useragent"] (自 1.4.46 起被 $REQUEST_HEADER["User-Agent"] 取代)匹配 User-Agent
$HTTP["language"] (自 1.4.46 起被 $REQUEST_HEADER["Accept-Language"] 取代)(自 1.4.21 起)匹配 Accept-Language
$HTTP["referer"] (自 1.4.46 起被 $REQUEST_HEADER["Referer"] 取代)匹配 Referer
$SERVER["socket"] 匹配套接字(本地地址,非远程地址)。值必须是“ip:port”格式——其中 ip 是可选的 IP 地址,port 是端口号——或者必须是 Unix 域路径。如果省略 IP 地址,则使用 INADDR_ANY (0.0.0.0),除非server.use-ipv6 = "enable" 在此块内,在这种情况下使用 in6addr_any ([::])。使用 == 设置此指令还会指示 lighttpd 绑定到此套接字并监听请求。$SERVER["socket"] 在全局范围有效;将 $SERVER["socket"] 放置在其他条件中可能会产生不良结果(如果不是因为历史上的(误)用,则会被拒绝)。

.

<operator> 是以下之一

操作符
== 字符串相等匹配
!= 字符串不相等匹配
=~ Perl 风格正则表达式匹配
!~ Perl 风格正则表达式不匹配
=^ 字符串前缀匹配(自 1.4.65 起)
=$ 字符串后缀匹配(自 1.4.65 起)

而 <value> 是一个带引号 ("") 的字符串,可以是字符串字面量或 正则表达式

示例

  # disable directory-listings for /download/*
  dir-listing.activate = "enable" 
  $HTTP["url"] =~ "^/download/" {
    dir-listing.activate = "disable" 
  }

  # handle virtual hosting
  # map all domains of a top-level-domain to a single document-root
  $HTTP["host"] =~ "(^|\.)example\.org$" {
    server.document-root = "/var/www/htdocs/example.org/pages/" 
  }

  # multiple sockets
  $SERVER["socket"] == "127.0.0.1:81" {
    server.document-root = "..." 
  }

  $SERVER["socket"] == "127.0.0.1:443" {
    ssl.pemfile = "/var/www/certs/localhost.pem" 
    ssl.engine = "enable" 

    server.document-root = "/var/www/htdocs/secure.example.org/pages/" 
  }

  # deny access for all googlebot
  $HTTP["useragent"] =~ "Google" {
    url.access-deny = ( "" )
  }

  # deny access for all image stealers (anti-hotlinking for images)
  $HTTP["referer"] !~ "^($|http://www\.example\.org)" {
    url.access-deny = ( ".jpg", ".jpeg", ".png" )
  }

  # deny the access to www.example.org to all user which 
  # are not in the 10.0.0.0/8 network
  $HTTP["host"] == "www.example.org" {
    $HTTP["remoteip"] != "10.0.0.0/8" {
     url.access-deny = ( "" )
    }
  }

  # Allow only 200.19.1.5 and 210.45.2.7 to
  # have access to www.example.org/admin/
  $HTTP["host"] == "www.example.org" {
    # !~ is a perl style regular expression not match
    $HTTP["remoteip"] !~ "^(200\.19\.1\.5|210\.45\.2\.7)$" {
      $HTTP["url"] =~ "^/admin/" {
        url.access-deny = ( "" )
      }
    }
  }

条件配置合并

lighttpd 配置在启动时解析并优化。配置在启动后是静态的。

在运行时,动态配置选择仅限于使用 lighttpd 条件语法和静态配置评估请求,例如与启动时解析的静态列表进行匹配。

换句话说,各种配置对象在启动后是静态的,包括后端服务器配置。在运行时解析请求时,可能会选择一个后端服务器,但后端配置在启动后是静态的。

配置不同部分中的选项不会在运行时动态合并。对于给定选项,该选项在最后匹配条件中的值是应用的实际值。在相同的 lighttpd 条件 { ... } 和相同的 { ... } 嵌套级别内,可以使用 +=,它在启动时解析,但 += 不适用于不同的 lighttpd 条件 { ... } 或条件内的不同嵌套级别 { ... }

在相同的范围级别(相同的 { } 嵌套级别),相同的条件块在启动时的解析过程中会合并。请注意,如果条件在相同的作用域级别(例如在其他 if-else 语句中)已经存在,则在 if-else 语句中重复条件可能会导致语法错误。同样,配置语法并非一种完整的编程语言,它也无意于此。对于任何复杂的逻辑,建议创建生成 lighttpd 配置语法作为输出的脚本。

故障排除

如果您没有在默认端口上运行,$HTTP["host"] 将附加端口,因此以 $ 结尾(不允许端口)的 正则表达式将不匹配。
要匹配带或不带端口,请将

"(^|\.)example\.org$"
改为
"(^|\.)example\.org(\:[0-9]*)?$"

请注意,某些早期版本的 lighttpd 不支持此处列出的完整配置文件语法。特别是,某些版本不支持“var.”变量、使用“+=”进行追加、嵌套条件或“else”块。某些选项的名称(例如,“server.dir-listing”)在 lighttpd 版本之间也已更改(即更改为“dir-listing.activate”)。

如果您在配置 lighttpd 时遇到问题,请考虑使用“-t”或“-p”选项来调试您的配置。请注意,某些早期版本的 lighttpd 不支持“-t”或“-p”选项。

高级用法

查看博客:https://blog.lighttpd.ac.cn/articles/2005/05/07/advanced-configuration-in-up-upcoming-1-4-x

使用变量

您可以在配置中设置自己的变量以简化配置。

注意:变量在启动时解析配置时展开;变量不会在运行时为每个请求展开。

  var.basedir = "/home/www/servers/" 
  $HTTP["host"] == "www.example.org" {
     server.name = "www.example.org" 
     include "incl-base.conf" 
  }

在 incl-base.conf 中

  server.document-root = basedir + server.name + "/pages/" 
  accesslog.filename   = basedir + server.name + "/logs/access.log" 

您还可以使用环境变量或默认变量 var.PID 和 var.CWD。

  var.basedir = env.LIGHTTPDBASE

  $HTTP["host"] == "www.example.org" {
     server.name = "www.example.org" 
     include "incl-base.conf" 
     include "incl-fastcgi.conf" 
  }

在 incl-fastcgi.conf 中

  fastcgi.server = ( ... => ((
     "socket" => basedir + server.name + "/tmp/fastcgi-" + PID + ".sock" 
  )) )

或者像用于 Rails 的 lighttpd 脚本那样

  var.basedir = var.CWD
  server.document-root = basedir + "/public/" 

限制

(非详尽列表)

配置语法并非一种完整的编程语言,它也无意于此。对于任何复杂的逻辑,建议创建生成 lighttpd 配置语法作为输出的脚本。

lighttpd 配置中无法完成的一些有用事情:(作为替代,您可以在真实的编程语言中创建一个脚本,然后使用 include_shell。)

  # testing if a variable has been set is NOT possible
  # INVALID
  var.not_sure_if_it_exists == undefined { ... set to default value ... }
  # INVALID

  # removing from arrays is NOT possible
  # INVALID
  server.modules -= ( "mod_idontwantyou" )
  # INVALID

全局上下文

  global {
    ...
  }

您不需要在主配置文件中使用它。
但是您可能难以在条件句的包含文件中设置服务器范围的配置。

示例

在 lighttpd.conf 中

  server.modules = ()
  $HTTP["host"] == "www.example.org" {
    include "incl-php.conf" 
  }

在 incl-php.conf 中

  global {
    server.modules += ("mod_fastcgi")
    static-file.exclude-extensions += (".php")
  }
  fastcgi.server = "..." 

选项

所有配置选项都可以在以下位置找到:配置选项

gstrauss 5 个月前更新 · 62 次修订