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