Eu tenho um problema de resolução de condição interessante para resolver e ainda não tive sorte com a pesquisa on-line e a documentação do lighttpd. Muitas dessas pesquisas levaram a perguntas semelhantes feitas aqui e respostas úteis (para essas perguntas, vamos ver como esta é executada:
Eu tenho o lighttpd rodando em um roteador de gateway (OpenWRT, ou Turris OS, se você preferir, pois é um Turris Omnia) e tem vários domínios apontando o caminho, como um proxy reverso para servidores no lado da LAN disso Porta de entrada.
A configuração geral sendo, em pro forma, como:
$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" => "..." ) ) )
...
}
Isso vem realizando um sonho há séculos.
Agora eu gostaria que um caminho particular, comum a todos esses sites fosse servido diretamente deste roteador.
Em pró-forma novamente:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
E eu posso combinar isso admiravelmente da seguinte forma (e funciona):
$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" => "..." ) ) )
...
}
}
Doce.
MAS, aqui está o problema que estou tentando resolver. Eu gostaria idealmente de encapsular a $HTTP["url"]
condição em um arquivo incluído e a $HTTP["host"]
condição em outro, de modo que eu possa:
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint
Eu me pergunto se estou esperando demais aqui. Como não consigo pensar ou encontrar uma maneira de fazê-lo.
Eu imagino se shared.conf
contivesse alguma declaração tal que existisse uma declaração de configuração como:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
ignore-all-subsequent-host-match-conditions
}
Outra ideia criativa, embora ingênua e impossível, é se pudéssemos reescrever $HTTP["host"]
semelhante a:
$HTTP["host"] = "null.net"
Para que as correspondências subsequentes, como $HTTP["host"] =~ "(a.com|b.com|c.com)$"
todas, falhem e a solicitação permaneça local.
Aqui estão algumas opções exploradas até agora:
Variáveis do servidor
Não vá, pois eles são avaliados quando a configuração é carregada, não quando as solicitações são processadas.
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Using-variables
Solicitar cabeçalhos
setenv.add-request-header
parece atraente:
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv
Se shared.conf
definirmos um cabeçalho de solicitação personalizado, talvez possamos testá-lo com um $REQUEST_HEADER["header"]
in distributed.conf
:
https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Conditional-Configuration
Mas não tive nenhum sucesso com isso. Parece que uma condicional assim:
$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" => "..." ) ) )
...
}
Simplesmente não funciona, e não posso realmente adivinhar o porquê. É difícil ver o que está acontecendo, mas se eu registrar a saída no tratamento condicional, parece que $REQUEST_HEADER["my_header"]
está sempre em branco, mesmo para um URL em que shared.conf
isso corresponde:
$HTTP["url"] =~ "^/topdir/subir/" {
setenv.add-request-header = ("my_header" => "value_I_set")
}
Parece que a condição não testa os cabeçalhos de solicitação definidos por setenv, tanto quanto os entregues.