我有一个有趣的条件解析问题要解决,并且还没有在线搜索和查看 lighttpd 文档的运气。其中许多搜索导致了此处提出的类似问题和有用的答案(对于那些问题,让我们看看这个问题是如何运行的:
我在网关路由器(OpenWRT,或 Turris OS,如果您愿意,因为它是 Turris Omnia)上运行 lighttpd,并且它有许多域指向它的方式,作为 LAN 端服务器的反向代理网关。
一般配置是,在形式上,如:
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
多年来,这一直是一个梦想。
现在我想要一个特定的路径,所有这些站点都可以直接从这个路由器提供服务。
再次备考:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
我可以将它完美地组合如下(并且有效):
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
} else {
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
}
甜的。
但是,这是我要解决的问题。理想情况下,我希望将$HTTP["url"]
条件封装在一个包含的文件中,并将$HTTP["host"]
条件封装在另一个文件中,以便我可以:
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint
我想知道我是否对这里抱有太多期望。因为我想不出也想不出办法。
我想如果shared.conf
包含一些语句,例如存在如下配置语句:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
ignore-all-subsequent-host-match-conditions
}
另一个创造性的想法是,如果我们可以重写$HTTP["host"]
类似于:
$HTTP["host"] = "null.net"
这样后续的匹配$HTTP["host"] =~ "(a.com|b.com|c.com)$"
都失败了,请求保持在本地。
以下是迄今为止探索的一些选项:
服务器变量
不行,因为这些是在加载配置时而不是在处理请求时评估的。
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Using-variables
请求标头
setenv.add-request-header
看起来很有吸引力:
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv
如果 inshared.conf
我们设置了一个自定义请求标头,也许我们可以使用$REQUEST_HEADER["header"]
in对其进行测试distributed.conf
:
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Conditional-Configuration
但我没有取得任何成功。似乎有这样的条件:
$REQUEST_HEADER["my_header"] == "value_I_set" {
# Do not act as a reverse proxy
} else $HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "host" => "..." ) ) )
...
}
根本行不通,我无法真正猜到为什么。很难看到发生了什么,但如果我在条件处理上记录输出,即使对于匹配$REQUEST_HEADER["my_header"]
的 URL,它似乎也总是空白:shared.conf
$HTTP["url"] =~ "^/topdir/subir/" {
setenv.add-request-header = ("my_header" => "value_I_set")
}
似乎该条件并未测试 setenv 设置的请求标头,与交付的标头一样多。