Reverse-Proxy

Lighttpd URL 和主機匹配以及包含文件跨越(可能嗎?)

  • February 24, 2022

我有一個有趣的條件解析問題要解決,並且還沒有線上搜尋和查看 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 設置的請求標頭,與傳遞的標頭一樣多。

一種可能的配置解決方案是將您的共享配置放在條件之後$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
}

引用自:https://serverfault.com/questions/1091694