У меня есть интересная проблема разрешения условий, которую нужно решить, и мне пока не повезло с онлайн-поиском и просмотром документации для lighttpd. Многие из этих поисков привели к похожим вопросам, заданным здесь, и к полезным ответам (на эти вопросы), поэтому давайте посмотрим, как работает этот:

У меня есть lighttpd, работающий на маршрутизаторе-шлюзе (OpenWRT или ОС Turris, если вы предпочитаете, поскольку это Turris Omnia), и у него есть несколько доменов, указывающих путь, который он использует в качестве обратного прокси-сервера для серверов на стороне локальной сети этого. шлюз.

Общая конфигурация, в проформе, выглядит так:

$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#Использование-переменных

Заголовки запроса

setenv.add-request-header выглядит привлекательно:

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

Если shared.confмы установим собственный заголовок запроса, возможно, мы сможем проверить его с помощью $REQUEST_HEADER["header"]in 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, в большей степени, чем доставленные.

no answer