Score:2

พร็อกซีแอปพลิเคชัน "พอร์ต" บน URL สัมพัทธ์ ("ไดเรกทอรีย่อย") ของเซิร์ฟเวอร์เดียวกันใน Apache 2.4 หรือไม่

ธง ci

ฉันเคยเห็น วิธีจัดการ URL ที่เกี่ยวข้องอย่างถูกต้องด้วย reverse proxy - อย่างไรก็ตาม ฉันมีปัญหาอย่างมากในการทำความเข้าใจสิ่งนี้ (และนำไปใช้กับปัญหาของฉัน) หวังว่าจะมีคนช่วยได้

สมมติว่าฉันมี Ubuntu 20.04 เป็นระบบปฏิบัติการเซิร์ฟเวอร์บนเซิร์ฟเวอร์ของฉัน ตัวอย่าง.คอม.

จากนั้นฉันติดตั้ง https://github.com/hartwork/jawanndenn บนเซิร์ฟเวอร์และเรียกใช้ - แอปพลิเคชันนี้ทำงานบนพอร์ต 8080 โดยค่าเริ่มต้น และฉันสามารถยืนยันได้ว่ามันทำงานบนเซิร์ฟเวอร์เองโดยการเรียกใช้:

wget -O- http://127.0.0.1:8080

จนถึงตอนนี้ดีมาก ตอนนี้ สิ่งที่ฉันต้องการคือ แทนที่จะเข้าถึง https://example.com:8080 ในการเข้าถึงแอปพลิเคชันนี้ ฉันต้องการเข้าถึง https://example.com/jaw - ที่ฉันมักจะโทร /กราม "ไดเรกทอรีย่อย" แต่อาจเป็น URL ที่เกี่ยวข้องได้แม่นยำกว่า กล่าวอีกนัยหนึ่ง ถ้าฉันเข้าใจคำศัพท์ถูกต้อง https://example.com/jaw จะย้อนกลับพร็อกซีเป็น https://example.com:8080.

ฉันได้ลองทำสิ่งนี้ภายใน <VirtualHost *:443> คำนิยามในของฉัน .conf ไฟล์:

  <ตำแหน่ง /กราม>
    ตัวเลือก -หลายมุมมอง -ดัชนี
    RewriteEngine เปิดอยู่
    ProxyPass http://127.0.0.1:8080
    ProxyPassReverse http://127.0.0.1:8080
    SetOutputFilter พร็อกซี-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </สถานที่>
  RewriteRule ^/jaw$ /jaw/ [R]

ใช้งานได้ - ในแง่ที่ว่าโหลดหน้าเริ่มต้นของแอปพลิเคชัน แต่ไม่สามารถโหลดทรัพยากรจำนวนมาก (.css, .js) ได้ เมื่อเปิดคอนโซลในเบราว์เซอร์ ฉันเห็นคำขอ 404 จำนวนมากสำหรับ:

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

ดังนั้น ฉันเดาว่า มีไฟล์ .js หรือคล้ายกันบางไฟล์ที่ต้องการโหลด /คงที่/... -> และถ้าเรียกจากที่อยู่ "พอร์ต" ก็จะจับคู่กับ http://127.0.0.1:8080/static/... และทุกอย่างจะดี แต่ตอนนี้ เนื่องจากเราเป็นผู้รับมอบฉันทะ:

  • คำขอเบราว์เซอร์ https://example.com/jaw
  • Apache รับสิ่งนั้นส่งต่อไปยัง https://example.com:8080ที่แอปพลิเคชันรับฟัง
  • แอปพลิเคชันส่งไฟล์กลับ (.js) ที่มีลิงก์ในแบบฟอร์ม /คงที่/...
  • เมื่อสิ่งเหล่านั้นกลับมาในเบราว์เซอร์ พวกมันจะถูกตีความว่าเป็น https://example.com/static/... - ก่อนนำไปใช้เป็นคำขอสำหรับเซิร์ฟเวอร์ซึ่งหาไม่พบ

ฉันยังพยายามกำจัดทั้งหมด <Location> ตัวอย่างด้านบนและใช้สิ่งนี้ใน <VirtualHost *:443> โหนด:

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

สิ่งเดียวกันที่เกิดขึ้นก่อนหน้านี้ - หน้าแรกได้รับการโหลด ทรัพยากรอื่น ๆ ทั้งหมดดูเหมือนจะอ้างอิงถึง /คงที่/... และพวกเขาทั้งหมด 404

สุดท้าย ฉันก็ตัดข้อความข้างต้นออกไปเช่นกัน และใช้สิ่งนี้:

  ProxyPass /jaw/ http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
  <ตำแหน่ง /กราม/>
    ProxyPassย้อนกลับ /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable เปิด
    ProxyHTMLURLแผนที่ / /jaw/
  </สถานที่>

สิ่งนี้มีลักษณะการทำงานเหมือนกันทุกประการ - การโหลดหน้าแรก ทรัพยากรล้มเหลว - ยกเว้นทรัพยากรที่แสดงอยู่ในคอนโซลของเบราว์เซอร์เป็น:

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

... และล้มเหลวด้วย 502 Proxy Error ดังนั้นการเขียนใหม่จึงเกิดขึ้น แต่มีบางอย่างที่ยังไม่ถูกต้อง

ดังนั้นคำถามของฉันคือ - ฉันจะพูดกับ Apache ถึงพร็อกซีได้อย่างไร ทุกอย่าง จากแอปพลิเคชันบน 127.0.0.1:8080 ไปจนถึงสิ่งที่ปรากฏเป็น "ไดเรกทอรีย่อย" (URL สัมพัทธ์? ที่นี่ /กราม)?


แก้ไข: ปรากฎว่า 502 Proxy Error เกิดจาก:

AH00898: การค้นหา DNS ล้มเหลวสำหรับ: 127.0.0.1:6789static ที่ส่งคืนโดย /poll/static/js/html.js

... เห็นได้ชัดว่าไม่มีเครื่องหมายทับ ก็เลยลงเอยว่า

  ProxyPass /jaw/ http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
  <ตำแหน่ง /กราม/>
    ProxyPassย้อนกลับ /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable เปิด
    ProxyHTMLURLแผนที่ / /jaw/
  </สถานที่>

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

in flag
กำหนดค่าเซิร์ฟเวอร์ส่วนหลังของคุณด้วย URL พื้นฐานที่ถูกต้อง ง่ายกว่าการบังคับให้เขียนซ้ำบนพร็อกซี
sdbbs avatar
ci flag
ขอบคุณ @GeraldSchneider - ที่ช่วยให้ฉันรู้ว่าแอปพลิเคชันนี้มีอาร์กิวเมนต์ `--url-prefix` และนั่นก็ได้ผลสำหรับฉัน ...
Score:3
ธง in

กำหนดค่าเซิร์ฟเวอร์ส่วนหลังของคุณด้วย URL พื้นฐานที่ถูกต้อง ง่ายกว่าการบังคับให้เขียนซ้ำบนพร็อกซี

การตั้งค่าควรเป็น JAWANNDENN_URL_PREFIX . เพียงตั้งค่าเป็น /กราม และควรสร้าง URL ทั้งหมดอย่างถูกต้อง

ตัวอย่างแรกของคุณควรใช้งานได้ แม้จะไม่มี ProxyHTMLURLMap และ OutputFilter

sdbbs avatar
ci flag
ขอบคุณ ฉันลงเอยด้วยการใช้ `--url-prefix` เพื่อระบุ `JAWANNDENN_URL_PREFIX` เป็น "`jaw`" จากนั้น `ProxyPass/ProxyPassReverse /jaw/ http://127.0.0.1:8080/jaw/` ก็ใช้ได้ ดีสำหรับผู้รับมอบฉันทะ

โพสต์คำตอบ

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