模式
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";
}