URL Lighttpd e correspondência de host e extensão de arquivo incluído (é possível?)

URL Lighttpd e correspondência de host e extensão de arquivo incluído (é possível?)

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.confcontivesse 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-headerparece atraente:

https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModSetEnv

Se shared.confdefinirmos 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.confeste 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
}

informação relacionada