Lighttpd URL 和主機匹配以及包含文件跨越(可能嗎?)
我有一個有趣的條件解析問題要解決,並且還沒有線上搜尋和查看 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
如果 in
shared.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 設置的請求標頭,與傳遞的標頭一樣多。
一種可能的配置解決方案是將您的共享配置放在條件之後
$HTTP["host"]
,在您的情況下,覆蓋代理配置$HTTP["url"] =~ "^/topdir/subir/" { server.document-root = "/www/sharedstuff" proxy.server = () }
另一種更靈活、更強大的解決方案:lighttpd mod_magnet允許您在幾行 lua 中編寫任意複雜的邏輯。您可以在 lighttpd mod_proxy 之前讓您的“共享”配置處理某些請求(在您的自定義 lua 腳本中)。
順便說一句,以下幼稚的解決方案是否也有效?共享配置:
$HTTP["url"] =~ "^/topdir/subir/" { server.document-root = "/www/sharedstuff" }
在包含在 lighttpd.conf 中的 shared.conf 中
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint else { include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint }