Рейтинг:0

Сопоставление URL-адреса и хоста Lighttpd и охват включаемого файла (возможно ли это?)

флаг pk

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

Рейтинг:0
флаг cn

Одним из возможных решений конфигурации является размещение вашей общей конфигурации после в $HTTP["хост"] условиях, а в вашем случае перезаписать конфиг прокси

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
    прокси.сервер = ()
}

Другое решение, более гибкое и мощное: lighttpd mod_magnet позволяет написать сколь угодно сложную логику в несколько строк lua. Вы можете сделать так, чтобы ваша «общая» конфигурация обрабатывала определенные запросы (в вашем пользовательском сценарии lua) до того, как lighttpd mod_proxy.

Кстати, работает ли следующее наивное решение? Общая конфигурация:

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

в shared.conf, включенном в lighttpd.conf как

include "/etc/lighttpd/conf.d/shared.conf" # содержит ограничение `$HTTP["url"]`
еще {
    include "/etc/lighttpd/conf.d/distributed.conf" # содержит ограничение `$HTTP["host"]`
}
Bernd Wechner avatar
флаг pk
Спасибо, mod_magnet всегда можно использовать, хотя я не решаюсь использовать его, пока не загнаю в угол. И, учитывая, что запасной вариант здесь заключается в том, чтобы просто сохранить обе конфигурации в одном файле (не идеально, но приемлемо), я не чувствовал острой необходимости пробовать mod_magnet здесь. Это отличный запасной вариант для очень конкретных потребностей, хотя да.
Bernd Wechner avatar
флаг pk
Однако, чтобы прояснить первое предложение, оно кажется мне интересным и удивительным. Но бывает ли так, что если тест `$HTTP["url"]` выполняется после `$HTTP["host"]` без `else`, он будет соответствовать и сбрасывать `proxy.server` на ` ()` после того, как он был установлен в разделе `$HTTP["host"]`? Ключевой урок заключается в том, что без «иначе» используются все условия соответствия, а более поздние могут изменить более ранние настройки? Ну хотя бы `proxy.server`? Отличное понимание, если так, спасибо!
флаг cn
@BerndWechner, что «отличное понимание» задокументировано: [слияние условных конфигураций lighttpd] (https://wiki.lighttpd.net/Docs_Configuration#Conditional-Configuration-Merging)
Bernd Wechner avatar
флаг pk
Документация временами действительно дает отличные идеи. Хотя я читаю документацию регулярно и в первую очередь, когда застреваю, конечно, не всегда получается найти то, что ищешь. Но большое спасибо за подсказку и указатель документа, очень признателен!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.