模式

lighttpd 配置在多处(docroot、redirect、rewrite、env.set 等)支持“模式”;并且它们共享以下结构。

有两种“捕获”可用;一种来自操作本身(例如 redirect/rewrite 中的正则表达式捕获,或 docroot 中主机名的标签),另一种来自操作栈中先前匹配的正则表达式条件。如果没有选定类型的捕获,则值为字符串为空。

语法

模式是由以下部分组成的字符串

  • 纯文本。仅当使用 \ 转义时才能包含特殊字符 $ 和 % – 请记住,对于配置,\ 也必须转义,因此您可能需要使用 \\ 进行转义。您也可以转义 ? (在 rewrite 中用于特殊的“split”)。
  • “%” 捕获引用(上一个匹配的正则表达式条件);后跟单个数字,或一个范围(有关范围语法,请参阅下文)
  • “$” 捕获引用(取决于操作);后跟单个数字,或一个范围(有关范围语法,请参阅下文)
  • “%” 引用 条件变量,例如:%{req.path};该条件可以前缀“enc:” (%{enc:req.path}),在这种情况下,该值将被 URL 编码。

范围

范围可以是单个元素 [n] (n 可以是多位数字),闭合范围 [n-m] 或开放范围 [n-][-m]
开放端总是被“G_MAXUINT”(一个非常大的正整数)替换。范围可以“反转”,即 n > m

现在有两种不同的范围使用方式

  • 正则表达式捕获的范围:捕获项会插入到范围内的所有值中;如果范围是反转的,它将从范围内的最高索引开始。
  • 主机名中标签的范围:类似于第一个范围,但插入的标签用“.”分隔;索引 0 代表“完整主机名”,包含 0 的范围将缩减为完整主机名;标签从顶级开始编号,并且范围被反向解释(只需查看示例,就会清楚)。

示例:简单重定向

redirect "http://%{req.host}%{req.path}?redirected=1";

示例:docroot

  • 对 “http://example.com/project/trunk” 的请求将指向 docroot “/var/www/project/trunk/htdocs”
  • 对 “http://sub.example.com/” 的请求将指向 docroot “/var/www/vhosts/com/sub.example”
if req.path =~ "^/project/([^/]*)" {
	docroot "/var/www/projects/%1/htdocs";
} else {
	docroot "/var/www/vhosts/$1/${2-}/htdocs";
}