У меня есть интересная проблема разрешения условий, которую нужно решить, и мне пока не повезло с онлайн-поиском и просмотром документации для 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, в большей степени, чем доставленные.