Lighttpd の URL とホストのマッチングおよびインクルード ファイルのスパニング (可能ですか?)

Lighttpd の URL とホストのマッチングおよびインクルード ファイルのスパニング (可能ですか?)

解決すべき興味深い条件解決問題があり、lighttpd のオンライン検索やドキュメントの参照はまだうまくいっていない。検索の結果、ここで尋ねられた同様の質問と役立つ回答 (それらの質問については、この質問がどのように実行されるかを見てみましょう) が多数見つかった。

私はゲートウェイ ルーター (OpenWRT、または Turris Omnia なので Turris OS が好みであれば) で 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"]条件を 1 つのインクルード ファイルにカプセル化し、条件を別のファイルにカプセル化して、$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次のような config ステートメントが存在するようなステートメントが含まれていたと想像します。

$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#変数の使用

リクエストヘッダー

setenv.add-request-header魅力的に見える:

https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv

shared.confでカスタム リクエスト ヘッダーを設定する場合は、$REQUEST_HEADER["header"]でそれをテストできる可能性がありますdistributed.conf

https://redmine.lighttpd.net/projects/1/wiki/docs_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 によって設定されたリクエスト ヘッダーではなく、配信されたリクエスト ヘッダーがテストされるようです。

答え1

考えられる設定解決策の1つは、共有設定を条件$HTTP["host"]、そしてあなたの場合はプロキシ設定を上書きする

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
    proxy.server = ()
}

より柔軟で強力な別のソリューション: lighttpdモッドマグネット数行の lua で任意の複雑なロジックを記述できます。lighttpd mod_proxy の前に、(カスタム lua スクリプト内の)「共有」構成で特定のリクエストを処理できます。

ところで、次の単純な解決策も機能しますか? 共有構成:

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
}

shared.confにlighttpd.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
}

関連情報