.png)
Tenho um problema interessante de resolução de condições 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 funciona:
Eu tenho o lighttpd rodando em um roteador gateway (OpenWRT ou Turris OS, se você preferir, pois é um Turris Omnia) e ele tem vários domínios apontando seu caminho, que ele distribui, como um proxy reverso para servidores no lado da LAN disso Porta de entrada.
A configuração geral é, 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á muito tempo.
Agora eu gostaria que um caminho específico, comum a todos esses sites, fosse atendido diretamente por este roteador.
Em pró-forma novamente:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
E posso combinar isso admiravelmente da seguinte maneira (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. Idealmente, gostaria de encapsular a $HTTP["url"]
condição em um arquivo incluído e a $HTTP["host"]
condição em outro, para 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 muito aqui. Como não consigo pensar ou encontrar uma maneira de fazer isso.
Imagino que 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 de $HTTP["host"]
forma semelhante a:
$HTTP["host"] = "null.net"
Para que as correspondências subsequentes $HTTP["host"] =~ "(a.com|b.com|c.com)$"
falhem e a solicitação permaneça local.
Aqui estão algumas opções exploradas até agora:
Variáveis de servidor
Não, pois eles são avaliados quando a configuração é carregada e 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 como esta:
$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 consigo 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 onde shared.conf
este 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 pelo setenv, tanto quanto os entregues.
Responder1
Uma possível solução de configuração é colocar sua configuração compartilhadadepoisas $HTTP["host"]
condições e, no seu caso, sobrescrever a configuração do proxy
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
proxy.server = ()
}
Outra solução, mais flexível e poderosa: lighttpdmod_magnetpermite que você escreva lógica arbitrariamente complexa em algumas linhas de lua. Você pode fazer com que sua configuração "compartilhada" lide com certas solicitações (em seu script lua personalizado) antes do lighttpd mod_proxy.
Aliás, a seguinte solução ingênua também funciona? Configuração compartilhada:
$HTTP["url"] =~ "^/topdir/subir/" {
server.document-root = "/www/sharedstuff"
}
em shared.conf incluído em lighttpd.conf como
include "/etc/lighttpd/conf.d/shared.conf" # contains the `$HTTP["url"]` constraint
else {
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint
}