Tengo un problema interesante de resolución de condiciones que resolver y todavía no he tenido suerte con la búsqueda en línea y la documentación de lighttpd. Muchas de esas búsquedas dieron lugar a preguntas similares hechas aquí y respuestas útiles (para esas preguntas), así que veamos cómo funciona esta:

Tengo lighttpd ejecutándose en un enrutador de puerta de enlace (OpenWRT, o sistema operativo Turris si lo prefiere, ya que es un Turris Omnia) y tiene una serie de dominios que señalan su camino que se distribuye, como un proxy inverso a servidores en el lado LAN de eso puerta.

La configuración general es, en 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" => "..." ) ) )
    ...
}

Eso ha estado trabajando un sueño durante siglos.

Ahora me gustaría que una ruta particular, común a todos estos sitios, se sirva directamente desde este enrutador.

En pro forma de nuevo:

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

Y puedo combinar esto admirablemente de la siguiente manera (y 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" => "..." ) ) )
       ...
   }
}

Dulce.

PERO, aquí está el problema que estoy tratando de resolver. Idealmente, me gustaría encapsular la $HTTP["url"]condición en un archivo incluido y la $HTTP["host"]condición en otro de modo que pueda:

include "/etc/lighttpd/conf.d/shared.conf"      # contains the `$HTTP["url"]` constraint
include "/etc/lighttpd/conf.d/distributed.conf" # contains the `$HTTP["host"]` constraint

Me pregunto si espero demasiado aquí. Como no puedo pensar o encontrar una manera de hacerlo.

Me imagino si shared.confcontenía alguna declaración tal que existiera una declaración de configuración como:

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
    ignore-all-subsequent-host-match-conditions 
}

Otra idea creativa, aunque ingenua e imposible, es si pudiéramos reescribir $HTTP["host"]algo similar a:

$HTTP["host"] = "null.net"

De modo que las coincidencias posteriores como $HTTP["host"] =~ "(a.com|b.com|c.com)$"todas fallan y la solicitud permanece local.

Aquí hay algunas opciones exploradas hasta ahora:

Variables del servidor

No, ya que estos se evalúan cuando se carga la configuración, no cuando se procesan las solicitudes.

https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Using-variables

Encabezados de solicitud

setenv.add-request-header se ve atractivo:

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

Si shared.confconfiguramos un encabezado de solicitud personalizado, tal vez podamos probarlo con un $REQUEST_HEADER["header"]in distributed.conf:

https://redmine.lighttpd.net/projects/1/wiki/docs_configuration#Conditional-Configuration

Pero no he tenido ningún éxito con eso. Parece que un condicional como este:

$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" => "..." ) ) )
    ...
}

Simplemente no funciona, y realmente no puedo adivinar por qué. Es difícil ver lo que está pasando, pero si registro la salida en el manejo condicional, parece que $REQUEST_HEADER["my_header"]siempre está en blanco, incluso si para una URL shared.confcoincide con esto:

$HTTP["url"] =~ "^/topdir/subir/" {
    setenv.add-request-header = ("my_header" => "value_I_set")
}

Parece que la condición no prueba los encabezados de solicitud establecidos por setenv, tanto como los entregados.

no answer