Puncte:0

Adresa URL Lighttpd și potrivirea gazdei și includerea fișierelor (este posibil?)

drapel pk

Am de rezolvat o problemă interesantă de rezolvare a stării și încă nu am avut noroc cu căutarea online și prin documentația pentru lighttpd. Multe dintre aceste căutări au condus la întrebări similare adresate aici și răspunsuri utile (pentru acele întrebări, așa că haideți să vedem cum funcționează aceasta:

Am lighttpd care rulează pe un router gateway (OpenWRT, sau Turris OS, dacă preferați, deoarece este un Turris Omnia) și are o serie de domenii care le indică drumul pe care le găzduiește, ca un proxy invers pentru serverele din partea LAN a acestuia. poarta de acces.

Configurația generală fiind, în proforma, ca:

$HTTP[„gazdă”] =~ „(a.com|b.com|c.com)$” {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
} else $HTTP["gazdă"] =~ "(d.org|e.org)$" {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
} else $HTTP["gazdă"] =~ "(f.net|g.net)$" {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
}

Asta a fost un vis de secole.

Acum aș dori o cale anume, comună tuturor acestor site-uri să fie deservită direct de acest router.

Din nou pro forma:

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

Și pot combina acest lucru admirabil după cum urmează (și funcționează):

$HTTP[„url”] =~ „^/topdir/subir/” {
    server.document-root = "/www/sharedstuff"
} altfel {
   $HTTP[„gazdă”] =~ „(a.com|b.com|c.com)$” {
       proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
       ...
   } else $HTTP["gazdă"] =~ "(d.org|e.org)$" {
       proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
       ...
   } else $HTTP["gazdă"] =~ "(f.net|g.net)$" {
       proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
       ...
   }
}

Dulce.

DAR, iată problema pe care încerc să o rezolv. Aș dori în mod ideal să încapsulez $HTTP[„url”] stare într-un fișier inclus și $HTTP[„gazdă”] condiție într-o altă astfel încât să pot:

include "/etc/lighttpd/conf.d/shared.conf" # conține constrângerea `$HTTP["url"]`
include „/etc/lighttpd/conf.d/distributed.conf” # conține constrângerea `$HTTP["gazdă"]`

Mă întreb dacă sper la prea multe aici. Pentru că nu mă pot gândi sau nu găsesc o modalitate de a o face.

Îmi imaginez dacă partajat.conf conținea o declarație astfel încât să existe o declarație de configurare precum:

$HTTP[„url”] =~ „^/topdir/subir/” {
    server.document-root = "/www/sharedstuff"
    ignora-toate-condițiile-ulterioare-de-potrivire-gazdă 
}

O altă idee creativă, dacă naivă și imposibilă, este dacă am putea rescrie $HTTP[„gazdă”] asemănător cu:

$HTTP[„gazdă”] = „null.net”

Deci meciurile ulterioare ca $HTTP[„gazdă”] =~ „(a.com|b.com|c.com)$” toate eșuează, iar cererea rămâne locală.

Iată câteva opțiuni explorate până acum:

Variabilele serverului

Nu merge, deoarece acestea sunt evaluate atunci când configurația este încărcată, nu atunci când cererile sunt procesate.

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

Antete de solicitare

setenv.add-request-header arata atractiv:

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

Dacă în partajat.conf setăm un antet de solicitare personalizat, poate îl putem testa cu a $REQUEST_HEADER[„header”] în distribuit.conf:

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

Dar nu am avut niciun succes cu asta. Se pare că un condițional ca acesta:

$REQUEST_HEADER["my_header"] == "value_I_set" {
   # Nu acționați ca un proxy invers 
} else $HTTP["gazdă"] =~ "(a.com|b.com|c.com)$" {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
} else $HTTP["gazdă"] =~ "(d.org|e.org)$" {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
} else $HTTP["gazdă"] =~ "(f.net|g.net)$" {
    proxy.server = ( "" => ( ( "gazdă" => "..." ) ) )
    ...
}

Pur și simplu nu funcționează și nu pot să înțeleg cu adevărat de ce.Este greu de văzut ce se întâmplă, dar dacă înregistrez ieșirea pe manipulare condiționată, se pare că $REQUEST_HEADER["my_header"] este întotdeauna necompletat chiar și pentru o adresă URL în care se află partajat.conf aceasta s-a potrivit cu:

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

Se pare că condiția nu testează anteturile cererilor stabilite de setenv, atât de mult decât cele livrate.

Puncte:0
drapel cn

O posibilă soluție de configurare este să vă puneți configurația partajată după cel $HTTP[„gazdă”] condiții și, în cazul dvs., să suprascrieți configurația proxy

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

O altă soluție, mai flexibilă și mai puternică: lighttpd mod_magnet vă permite să scrieți logica arbitrar complexă în câteva rânduri de lua. Ați putea avea configurația dvs. „partajată” să gestioneze anumite solicitări (în scriptul dvs. personalizat lua) înainte de lighttpd mod_proxy.

BTW, funcționează și următoarea soluție naivă? Configurație partajată:

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

în shared.conf inclus în lighttpd.conf ca

include "/etc/lighttpd/conf.d/shared.conf" # conține constrângerea `$HTTP["url"]`
else {
    include „/etc/lighttpd/conf.d/distributed.conf” # conține constrângerea `$HTTP["gazdă"]`
}
Bernd Wechner avatar
drapel pk
Mulțumesc, mod_magnet este întotdeauna o opțiune, deși tind să ezit să-l folosesc până când sunt încolțit. Și având în vedere soluția de rezervă aici este pur și simplu de a păstra ambele configurații într-un singur fișier (nu este ideal, dar viabil), nu am simțit nevoia presantă să încerc mod_magnet aici. Este o soluție minunată pentru nevoi foarte speciale, deși da.
Bernd Wechner avatar
drapel pk
Pentru a clarifica prima sugestie, totuși, mi se pare interesantă și surprinzătoare. Dar este cazul că, dacă testul `$HTTP["url"]` este făcut după `$HTTP["gazdă"]` fără un `else`, acesta ar putea potrivi și reseta `proxy.server` la ` ()` după ce a fost setat în secțiunea `$HTTP["gazdă"]`? Învățarea cheie este că fără „altceva” toate condițiile de potrivire sunt folosite și cele ulterioare pot modifica setările anterioare? Ei bine, cel puțin `proxy.server`? O perspectivă grozavă dacă da, mulțumesc!
drapel cn
@BerndWechner că „înțelegerea excelentă” este documentată: [lighttpd Conditional Configuration Merging](https://wiki.lighttpd.net/Docs_Configuration#Conditional-Configuration-Merging)
Bernd Wechner avatar
drapel pk
Documentarea uneori oferă o perspectivă excelentă. Deși citesc documentul în mod regulat și mai întâi când sunt blocat, cu siguranță nu este întotdeauna cazul în care cineva găsește ceea ce caută. Dar mulțumesc foarte mult pentru sfat și doc pointer, foarte apreciat!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.