Score:0

NginX: ให้บริการแอปพลิเคชันภายใต้เส้นทางย่อย

ธง tn

ฉันมีแอปพลิเคชันหน้าเดียวหลายแอปพลิเคชันที่ทำงานในคอนเทนเนอร์ของตัวเองภายใต้โฮมไดเร็กทอรีซึ่งค่อนข้างตรงไปตรงมา

ตอนนี้ฉันต้องการกำหนดเส้นทางไปยังแอปพลิเคชันเหล่านั้นภายใต้รายการ DNS เดียวกันโดยใช้เส้นทางที่แตกต่างกัน เช่น:

domain.com -> defaultAppContainer
domain.com/app1 -> คอนเทนเนอร์ 1
domain.com/app2 -> คอนเทนเนอร์ 2

ฉันไม่มีตัวเลือกในการเขียนเส้นทางใหม่ในระหว่างการกำหนดเส้นทาง ดังนั้นฉันจึงต้องการให้ Nginx ฟังเส้นทาง /app1 หรือ /app2 ตามลำดับและให้บริการแอปพลิเคชันอย่างถูกต้องจากนั้น ขณะนี้ทุกสิ่งที่ฉันได้ลองส่งผลให้เกิดข้อผิดพลาด

ฉันได้พิจารณาความเป็นไปได้สองประการ:

  • พร็อกซีพาธย่อยไปที่บ้านโดยใช้สิ่งที่ต้องการ
    ตำแหน่ง /app1 {
      proxy_pass $host/;
    }
    
    แต่สิ่งนี้ดูเหมือนจะใช้ไม่ได้กับส่วนหน้า ฉันคิดว่าบางเส้นทางสับสนในคำขอ
  • ให้บริการไฟล์ทั้งหมดภายใต้เส้นทางย่อย เช่น:
    ตำแหน่ง /app1 {
      นามแฝง root /usr/share/nginx/html/;
    }
    
    โดยที่นามแฝงชี้ไปที่ฐานของเว็บแอปที่สร้างขึ้น สิ่งนี้ทำให้ฉัน CONN_RESET ข้อผิดพลาด.

นอกจากนี้ การเปลี่ยนเส้นทางด้วย 307 ไม่ใช่ตัวเลือกเนื่องจากจะทำให้ไคลเอ็นต์เรียก URL พื้นฐานโดยไม่มีเส้นทาง ซึ่งจะถูกส่งไปยังแอปเริ่มต้น

Score:1
ธง gr

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

อย่างไรก็ตามหากเป็น SPA จริง ๆ สมมติว่าเป็นแอป React ที่ใช้บางอย่างเช่น แฮชเราเตอร์ ค่อนข้างมากกว่า เบราว์เซอร์ เราเตอร์การแก้ปัญหาโดยอ้างอิงจากการเขียนซ้ำตามเงื่อนไขตามคำขอ ผู้อ้างอิง ส่วนหัว HTTP เป็นไปได้:

เซิร์ฟเวอร์ {
    ...
    ถ้า ($http_referer ~ ^https?://yourdomain.com/app1/) {
        เขียนใหม่ ^ /app1$uri;
    }
    ถ้า ($http_referer ~ ^https?://yourdomain.com/app2/) {
        เขียนใหม่ ^ /app2$uri;
    }
    ...
    ตำแหน่ง /app1/ {
        proxy_pass http://container1/;
    }
    ตำแหน่ง /app2/ {
        proxy_pass http://container2/;
    }
}

เครื่องหมายทับต่อท้ายทั้งหมดที่ใช้ที่นี่ใช้เพื่อจุดประสงค์ การลบเครื่องหมายทับใด ๆ จะทำให้การแก้ปัญหาเสียหาย!

สิ่งนี้ไม่สามารถใช้ได้กับสิ่งอื่นใดนอกจาก SPA (รวมถึงแอปพลิเคชันที่ใช้การกำหนดเส้นทาง "เสมือน" ตาม API ประวัติเบราว์เซอร์ HTML5) เนื่องจากตรรกะการเขียนซ้ำจะใช้งานไม่ได้หลังจากการเปลี่ยนจากหน้าแรกไปยังหน้าแรก

masus04 avatar
tn flag
ขอบคุณมากสำหรับการตอบกลับของคุณ! แอปพลิเคชันทั้งหมดถูกใช้งานโดยใช้หนึ่งในสิ่งต่อไปนี้: react, vuejs หรือ Flutter แต่การรับประกันจะสิ้นสุดลงและฉันไม่สามารถควบคุมการใช้งานที่แน่นอนได้ นอกจากนี้ หน้าที่ที่แท้จริงของการเขียนซ้ำคืออะไร?

โพสต์คำตอบ

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