Score:0

Lighttpd URL และการจับคู่โฮสต์และการรวมไฟล์ (เป็นไปได้หรือไม่)

ธง pk

ฉันมีปัญหาการแก้ไขเงื่อนไขที่น่าสนใจที่ต้องแก้ไข และยังไม่มีโชคในการค้นหาออนไลน์และดูเอกสารประกอบสำหรับ lighttpd เลย การค้นหาจำนวนมากนำไปสู่คำถามที่คล้ายกันซึ่งถามที่นี่และคำตอบที่เป็นประโยชน์ (สำหรับคำถามเหล่านั้น มาดูกันว่าคำถามนี้ทำงานอย่างไร:

ฉันมี lighttpd ที่ทำงานบนเราเตอร์เกตเวย์ (OpenWRT หรือ Turris OS หากคุณต้องการเพราะมันเป็น Turris Omnia) และมีโดเมนจำนวนหนึ่งที่ชี้ทางที่มันทำฟาร์มออกมา เป็นพร็อกซีย้อนกลับไปยังเซิร์ฟเวอร์บนฝั่ง LAN ของสิ่งนั้น ประตู.

การกำหนดค่าทั่วไปในรูปแบบ pro เช่น:

$HTTP["โฮสต์"] =~ "(a.com|b.com|c.com)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
} อื่น $HTTP["โฮสต์"] =~ "(d.org|e.org)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
} อื่น $HTTP["host"] =~ "(f.net|g.net)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
}

ที่ได้ทำงานในฝันมานาน

ตอนนี้ฉันต้องการเส้นทางเฉพาะซึ่งเป็นเส้นทางทั่วไปสำหรับไซต์เหล่านี้ทั้งหมดที่จะให้บริการจากเราเตอร์นี้โดยตรง

ในรูปแบบ Pro อีกครั้ง:

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

และฉันสามารถรวมสิ่งนี้ได้อย่างน่าชื่นชมดังต่อไปนี้ (และใช้งานได้):

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
} อื่น {
   $HTTP["โฮสต์"] =~ "(a.com|b.com|c.com)$" {
       proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
       ...
   } อื่น $HTTP["โฮสต์"] =~ "(d.org|e.org)$" {
       proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
       ...
   } อื่น $HTTP["host"] =~ "(f.net|g.net)$" {
       proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
       ...
   }
}

หวาน.

แต่นี่คือปัญหาที่ฉันพยายามแก้ไข ฉันต้องการสรุปการ $HTTP["url"] สภาพรวมในไฟล์เดียวและ $HTTP["โฮสต์"] เงื่อนไขอื่นที่ฉันสามารถ:

รวม "/etc/lighttpd/conf.d/shared.conf" # มีข้อจำกัด `$HTTP["url"]
รวม "/etc/lighttpd/conf.d/distributed.conf" # มีข้อจำกัด `$HTTP["host"]

สงสัยจะหวังมากไปหรือเปล่านี่ เพราะคิดหรือหาวิธีไม่ได้

ฉันจินตนาการว่าถ้า แชร์.conf มีคำสั่งบางอย่างที่มีคำสั่ง config เช่น:

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
    ละเว้นเงื่อนไขการจับคู่โฮสต์ที่ตามมาทั้งหมด 
}

อีกแนวคิดที่สร้างสรรค์ หากไร้เดียงสาและเป็นไปไม่ได้ ก็คือถ้าเราสามารถเขียนใหม่ได้ $HTTP["โฮสต์"] คล้ายกับ:

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

ดังนั้นการแข่งขันที่ตามมาเช่น $HTTP["โฮสต์"] =~ "(a.com|b.com|c.com)$" ทั้งหมดล้มเหลว และคำขอยังคงอยู่ในเครื่อง

นี่คือตัวเลือกบางส่วนที่สำรวจแล้ว:

ตัวแปรเซิร์ฟเวอร์

ไม่ไป เนื่องจากสิ่งเหล่านี้ได้รับการประเมินเมื่อโหลดการกำหนดค่า ไม่ใช่เมื่อคำขอได้รับการประมวลผล

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

ส่วนหัวของคำขอ

setenv.add-request-header ดูน่าสนใจ:

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

ถ้าใน แชร์.conf เราตั้งค่าส่วนหัวของคำขอที่กำหนดเอง บางทีเราอาจทดสอบด้วย $REQUEST_HEADER["ส่วนหัว"] ใน กระจาย.conf:

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

แต่ฉันยังไม่ประสบความสำเร็จกับสิ่งนั้น ดูเหมือนว่าจะมีเงื่อนไขดังนี้:

$REQUEST_HEADER["my_header"] == "value_I_set" {
   #อย่าทำตัวเป็นผู้รับมอบฉันทะย้อนกลับ 
} อื่น $HTTP["โฮสต์"] =~ "(a.com|b.com|c.com)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
} อื่น $HTTP["โฮสต์"] =~ "(d.org|e.org)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
} อื่น $HTTP["host"] =~ "(f.net|g.net)$" {
    proxy.server = ( "" => ( ( "โฮสต์" => "..." ) ) )
    ...
}

ไม่ได้ผลและฉันไม่สามารถอธิบายได้ว่าทำไมมันยากที่จะดูว่าเกิดอะไรขึ้น แต่ถ้าฉันบันทึกผลลัพธ์ในการจัดการตามเงื่อนไข ดูเหมือนว่าจะเป็นอย่างนั้น $REQUEST_HEADER["my_header"] จะเว้นว่างไว้เสมอแม้สำหรับ URL ที่อยู่ใน แชร์.conf สิ่งนี้ตรงกัน:

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

ดูเหมือนว่าเงื่อนไขจะไม่ทดสอบส่วนหัวคำขอที่กำหนดโดย setenv มากเท่ากับที่จัดส่ง

Score:0
ธง cn

วิธีแก้ไขการกำหนดค่าที่เป็นไปได้วิธีหนึ่งคือการวางการกำหนดค่าที่ใช้ร่วมกัน หลังจาก เดอะ $HTTP["โฮสต์"] เงื่อนไข และในกรณีของคุณ ให้เขียนทับการกำหนดค่าพร็อกซี

$HTTP["url"] =~ "^/topdir/subir/" {
    server.document-root = "/www/sharedstuff"
    พร็อกซีเซิร์ฟเวอร์ = ()
}

โซลูชันอื่นที่ยืดหยุ่นและมีประสิทธิภาพมากกว่า: lighttpd mod_magnet ช่วยให้คุณสามารถเขียนตรรกะที่ซับซ้อนโดยพลการใน lua ไม่กี่บรรทัด คุณสามารถให้การกำหนดค่า "ที่ใช้ร่วมกัน" จัดการคำขอบางอย่าง (ในสคริปต์ lua ที่กำหนดเองของคุณ) ก่อน lighttpd mod_proxy

BTW วิธีแก้ปัญหาไร้เดียงสาต่อไปนี้ใช้ได้หรือไม่ การกำหนดค่าที่ใช้ร่วมกัน:

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

ใน shared.conf รวมอยู่ใน lighttpd.conf เป็น

รวม "/etc/lighttpd/conf.d/shared.conf" # มีข้อจำกัด `$HTTP["url"]
อื่น {
    รวม "/etc/lighttpd/conf.d/distributed.conf" # มีข้อจำกัด `$HTTP["host"]
}
Bernd Wechner avatar
pk flag
ขอบคุณ mod_magnet เป็นตัวเลือกเสมอ แม้ว่าฉันจะลังเลที่จะใช้จนกว่าจะเข้าโค้ง และจากทางเลือกที่นี่เป็นเพียงการเก็บการกำหนดค่าทั้งสองไว้ในไฟล์เดียว (ไม่เหมาะ แต่ใช้งานได้) ฉันไม่รู้สึกว่าจำเป็นต้องลอง mod_magnet ที่นี่ เป็นทางเลือกที่ยอดเยี่ยมสำหรับความต้องการเฉพาะอย่างใช่
Bernd Wechner avatar
pk flag
เพื่ออธิบายคำแนะนำแรกให้ชัดเจนขึ้น มันดูน่าสนใจและน่าประหลาดใจสำหรับฉัน แต่เป็นกรณีที่หากการทดสอบ `$HTTP["url"]` เกิดขึ้นหลังจาก `$HTTP["host"]` โดยไม่มี `else` การทดสอบจะตรงกันและรีเซ็ต `proxy.server` เป็น ` ()` หลังจากตั้งค่าในส่วน `$HTTP["host"]` แล้วหรือยัง การเรียนรู้ที่สำคัญคือการที่ไม่มี 'else' เงื่อนไขการจับคู่ทั้งหมดจะถูกใช้ และเงื่อนไขที่ตามมาภายหลังจะสามารถเปลี่ยนการตั้งค่าก่อนหน้านี้ได้หรือไม่ อย่างน้อย `proxy.server`? ข้อมูลเชิงลึกที่ดี ถ้าเป็นเช่นนั้น ขอบคุณ!
cn flag
@BerndWechner มีการบันทึก "ข้อมูลเชิงลึกที่ยอดเยี่ยม": [lighttpd การผสานการกำหนดค่าตามเงื่อนไข](https://wiki.lighttpd.net/Docs_Configuration#Conditional-Configuration-Merging)
Bernd Wechner avatar
pk flag
เอกสารในบางครั้งให้ข้อมูลเชิงลึกที่ดีอย่างแท้จริง แม้ว่าฉันจะอ่านเอกสารเป็นประจำและอ่านครั้งแรกเมื่อติดขัด ก็ไม่แน่เสมอไปว่าคนๆ หนึ่งจะพบสิ่งที่ต้องการ แต่ขอบคุณมากสำหรับเคล็ดลับและตัวชี้เอกสาร ขอบคุณมาก!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา