Score:0

nginx ย้อนกลับพรอกซีด้วยพาธย่อย

ธง in

ฉันสร้างเว็บแอปที่จะรับฟังพอร์ตและจัดการคำขอ HTTP ตัวอย่างเช่น ถ้าฉันเรียกใช้ในเครื่องที่ 127.0.0.1:3000. ฉันสามารถเข้าถึงได้ด้วย http://127.0.0.1:3000/path/within/app บนเบราว์เซอร์ของฉัน ฉันต้องการปรับใช้บนหนึ่งในเซิร์ฟเวอร์ของฉัน ซึ่งกำหนดค่าด้วย จิงซ์ เพื่อจัดการคำขอที่เข้ามาทั้งหมด (และ TLS) และส่งต่อไปยังแอปพลิเคชันต่างๆ (ฟังที่ http://127.0.0.1:xxx). โดยปกติแล้ว ฉันจะให้แต่ละแอปมีโดเมนย่อยที่แตกต่างกัน (เช่น access แอป1 กับ app1.example.com และ แอป2 กับ app2.example.com) แต่จะสะดวกกว่าถ้าฉันสามารถใช้ subpath (เช่น access แอป1 กับ example.com/app1 และ แอป2 กับ example.com/app2). แต่ฉันไม่แน่ใจว่าจะกำหนดค่าอย่างไร

ไฟล์การกำหนดค่าปัจจุบันของฉันมีลักษณะดังนี้ สมมติว่าแอปของฉันกำลังฟังอยู่ที่ 127.0.0.1:3000.

ที่ตั้ง ^~ /app1 {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
    proxy_set_header โฮสต์ $http_host;
    ปิด proxy_redirect;
    proxy_pass http://127.0.0.1:3000/;
}

ฉันต้องการบรรลุสิ่งต่อไปนี้

  1. เมื่อฉันเข้าถึง https://example.com/app1ก็จะเทียบเท่ากับการเข้าถึง http://127.0.0.1:3000.
  2. เมื่อฉันเข้าถึง https://example.com/app1/path/within/appก็จะเทียบเท่ากับการเข้าถึง http://127.0.0.1:3000/path/within/app.

อย่างไรก็ตาม ด้วยไฟล์คอนฟิกูเรชันที่กล่าวถึงข้างต้น เฉพาะส่วนแรกเท่านั้นที่ใช้งานได้ ถ้าฉันเข้าถึง https://example.com/app1/pathแอพของฉันร้องเรียนว่ามันเป็น http://127.0.0.1:3000//path ที่เข้าถึงได้จริง และไม่รู้วิธีจัดการ //เส้นทาง.

ฉันไม่ต้องการแก้ไขส่วนใดส่วนหนึ่งของแอปพลิเคชันของฉันเพื่อให้สามารถทำงานได้โดยอิสระ หากฉันตัดสินใจให้โดเมนย่อยในอนาคต และคาดว่าจะแก้ไขด้วยการแก้ไขเฉพาะไฟล์การกำหนดค่า nginx หากเป็นไปได้ นอกจากนี้ ฉันทราบปัญหาว่าลิงก์ที่คลิกได้ใดๆ ที่สร้างโดยแอปจะต้องจัดการเส้นทางย่อยด้วย แต่แอปนี้เรียบง่ายพอที่จะไม่เป็นปัญหา

ขอบคุณ.

Ivan Shatsky avatar
gr flag
เปลี่ยนตำแหน่งของคุณเป็น `location ^~ /app1/ { ... }` (สังเกตเครื่องหมายทับ) หากคุณต้องการให้ URI `/app1` ใช้งานได้เช่นกัน ให้เพิ่ม `location = /app1 { return 301 /app1/; }` เพื่อกำหนดค่าของคุณ
lewisxy avatar
in flag
ขอบคุณ มีวิธีทำให้ `/app1` ทำงานโดยไม่ต้องส่ง 301 ไหม
Ivan Shatsky avatar
gr flag
คุณสามารถลอง `location = /app1 { rewrite ^ /app1/ last; }`. อย่างไรก็ตาม ในบางกรณี อาจทำให้แอปของคุณโหลดเนื้อหาไม่ได้ (ดูคำอธิบายในคำตอบ [นี้](https://stackoverflow.com/a/70778444/7121513) และฉันไม่แนะนำให้ทำเช่นนั้น
Score:0
ธง us

ลองกำหนดค่าต่อไปนี้

ตำแหน่ง /app1/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
    proxy_set_header โฮสต์ $http_host;
    ปิด proxy_redirect;
    proxy_pass http://127.0.0.1:3000/;
}

ตำแหน่ง /app1 {
    ส่งคืน 301 /app1/;
}
lewisxy avatar
in flag
ขอบคุณมันใช้งานได้ อย่างไรก็ตาม มีวิธีการกำหนดค่าเพื่อให้ฉันไม่ต้องส่ง 301 เมื่อไคลเอนต์เข้าถึง `/app1` หรือไม่ กล่าวอีกนัยหนึ่ง ฉันต้องการเปลี่ยนเส้นทางบนฝั่งเซิร์ฟเวอร์มากกว่าฝั่งไคลเอนต์ ถ้าเป็นไปได้
us flag
คุณแน่ใจหรือว่านั่นคือสิ่งที่คุณต้องการ? จากนั้นคุณจะมีเนื้อหาที่ซ้ำกันที่ `http://example.com/app1` และ `http://example.com/app1/` URL ซึ่งเป็นปัญหาสำหรับ SEO
lewisxy avatar
in flag
แอปปัจจุบันที่ฉันใช้งานอยู่มีเฉพาะ JSON API เท่านั้น จึงไม่มีหน้า HTML อย่างไรก็ตาม ฉันไม่มีประสบการณ์เพียงพอในหัวข้อนี้จะเกิดอะไรขึ้นหากแอปของฉันเป็นเว็บไซต์จริง โดยทั่วไปเราชอบแบบที่มีเครื่องหมายทับหรือไม่? นอกจากนี้ ตัวเลือกนี้จะส่งผลต่อพารามิเตอร์การค้นหาอย่างไร (ที่ตามหลัง `?`) ถ้าเป็นเช่นนั้น
us flag
อาร์กิวเมนต์ของข้อความค้นหาไม่ขึ้นกับองค์ประกอบเส้นทางของ URL ดังนั้นจึงไม่สำคัญ ในโปรเจ็กต์ของฉันเอง ฉันเปลี่ยนเส้นทาง 301 จาก `/app1` เป็น `/app1/` เนื่องจากอันที่มีเครื่องหมายทับปิดท้ายนั้นง่ายต่อการจัดการในที่ต่างๆ

โพสต์คำตอบ

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