У меня есть интересная проблема разрешения условий, которую нужно решить, и мне пока не повезло с онлайн-поиском и просмотром документации для lighttpd. Многие из этих поисков привели к похожим вопросам, заданным здесь, и к полезным ответам (по этим вопросам давайте посмотрим, как работает этот:
У меня есть lighttpd, работающий на маршрутизаторе-шлюзе (OpenWRT или ОС Turris, если вы предпочитаете, так как это Turris Omnia), и у него есть несколько доменов, указывающих путь, который он использует в качестве обратного прокси-сервера для серверов на стороне локальной сети этого. шлюз.
Общая конфигурация, в проформе, выглядит так:
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
}
Это работало мечтой целую вечность.
Теперь я хотел бы, чтобы определенный путь, общий для всех этих сайтов, обслуживался с этого маршрутизатора напрямую.
Еще раз для проформы:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
И я могу замечательно комбинировать это следующим образом (и это работает):
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
} еще {
$HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
}
}
Сладкий.
НО, вот проблема, которую я пытаюсь решить. Я хотел бы идеально инкапсулировать $HTTP["адрес"]
условие в одном включенном файле и $HTTP["хост"]
условие в другом такое, что я могу:
include "/etc/lighttpd/conf.d/shared.conf" # содержит ограничение `$HTTP["url"]`
include "/etc/lighttpd/conf.d/distributed.conf" # содержит ограничение `$HTTP["host"]`
Интересно, не слишком ли я надеюсь здесь. Поскольку я не могу придумать или найти способ сделать это.
Я представляю, если общий.conf
содержал некоторый оператор, такой, что существовал оператор конфигурации, например:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
игнорировать все последующие условия совпадения хостов
}
Еще одна творческая, хотя и наивная и невозможная идея, заключается в том, чтобы мы могли переписать $HTTP["хост"]
сродни:
$HTTP["хост"] = "null.net"
Чтоб последующие совпадения понравились $HTTP["хост"] =~ "(a.com|b.com|c.com)$"
все терпят неудачу, и запрос остается локальным.
Вот некоторые варианты, изученные на данный момент:
Переменные сервера
Нет, так как они оцениваются при загрузке конфигурации, а не при обработке запросов.
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Использование-переменных
Заголовки запроса
setenv.add-запрос-заголовок
выглядит привлекательно:
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv
Если в общий.conf
мы устанавливаем собственный заголовок запроса, возможно, мы можем проверить его с помощью $REQUEST_HEADER["заголовок"]
в распределенный.conf
:
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Условная конфигурация
Но я не имел никакого успеха с этим. Кажется, что условное вроде этого:
$REQUEST_HEADER["my_header"] == "value_I_set" {
# Не выступать в роли обратного прокси
} else $HTTP["host"] =~ "(a.com|b.com|c.com)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(d.org|e.org)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
} else $HTTP["host"] =~ "(f.net|g.net)$" {
proxy.server = ( "" => ( ( "хост" => "..." )) )
...
}
Просто не работает, и я не могу понять, почему.Трудно понять, что происходит, но если я регистрирую вывод при условной обработке, кажется, что $REQUEST_HEADER["мой_заголовок"]
всегда пусто даже для URL-адреса, где в общий.conf
это совпало:
$HTTP["url"] =~ "^/topdir/subir/" {
setenv.add-request-header = ("my_header" => "value_I_set")
}
Похоже, что условие не проверяет заголовки запросов, установленные setenv, в большей степени, чем доставленные.