Tôi đã từng thấy Cách xử lý chính xác các url tương đối bằng proxy ngược - tuy nhiên tôi gặp khó khăn lớn khi hiểu điều này (và áp dụng nó vào vấn đề của mình), hy vọng ai đó có thể giúp đỡ.
Giả sử tôi có Ubuntu 20.04 làm hệ điều hành máy chủ trên máy chủ của mình, ví dụ.com
.
Sau đó, tôi cài đặt https://github.com/hartwork/jawanndenn trên máy chủ và chạy nó - ứng dụng này theo mặc định chạy trên cổng 8080; và tôi có thể xác nhận rằng nó chạy trên chính máy chủ bằng cách chạy:
quên -O- http://127.0.0.1:8080
Càng xa càng tốt. Bây giờ, điều tôi muốn là: thay vì truy cập https://example.com:8080
để truy cập ứng dụng này, tôi muốn truy cập https://example.com/jaw
- nơi tôi thường gọi /hàm
một "thư mục con", nhưng nó có thể chính xác hơn là một URL tương đối. Nói cách khác, nếu tôi hiểu thuật ngữ này một cách chính xác, https://example.com/jaw
sẽ đảo ngược proxy để https://example.com:8080
.
Vì vậy, tôi đã thử làm điều này, trong vòng <VirtualHost *:443>
định nghĩa trong tôi .conf
tập tin:
<Vị trí /hàm>
Tùy chọn -Multiviews -Chỉ mục
Viết LạiEngine Trên
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
SetOutputFilter proxy-html
ProxyHTMLURLMap http://127.0.0.1:8080
</Vị trí>
RewriteRule ^/jaw$ /jaw/ [R]
Điều này hoạt động - theo nghĩa là trang bắt đầu của ứng dụng được tải; nhưng không thể tải cả đống tài nguyên (.css, .js); mở bảng điều khiển trong trình duyệt của tôi, tôi có thể thấy một loạt các yêu cầu 404 cho:
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
...
Vì vậy, tôi đoán là, có một số tệp .js hoặc tương tự, chỉ muốn tải /tĩnh/...
-> và nếu được gọi từ địa chỉ "cổng", chúng sẽ ánh xạ tới http://127.0.0.1:8080/static/...
và tất cả sẽ ổn thôi; nhưng bây giờ, vì chúng tôi được ủy quyền:
- yêu cầu trình duyệt
https://example.com/jaw
- Apache nhận được điều đó, chuyển tiếp nó tới
https://example.com:8080
, nơi ứng dụng lắng nghe
- Ứng dụng gửi lại các tệp (.js) có liên kết ở dạng
/tĩnh/...
- Khi chúng quay trở lại trình duyệt, chúng được hiểu là
https://example.com/static/...
- trước khi được sử dụng làm yêu cầu cho máy chủ, sau đó không thể tìm thấy chúng
Tôi cũng đã cố gắng loại bỏ toàn bộ <Location>
đoạn trích ở trên và chỉ sử dụng đoạn mã này trong <VirtualHost *:443>
nút:
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
Chính xác điều tương tự xảy ra như trước đây - trang đầu tiên được tải, tất cả các tài nguyên khác dường như chuyển sang /tĩnh/...
và tất cả đều là 404.
Cuối cùng, tôi cũng đã loại bỏ các câu trên và sử dụng điều này:
ProxyPass /jaw/ http://127.0.0.1:8080
ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
<Vị trí /hàm/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080
ProxyHTMLBật Bật
ProxyHTMLURLMap / /jaw/
</Vị trí>
Điều này có hành vi giống hệt nhau - tải trang đầu tiên, tài nguyên không thành công - ngoại trừ tài nguyên hiện được liệt kê trong bảng điều khiển trình duyệt dưới dạng:
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
...
... và chúng không thành công với Lỗi 502 Proxy. Vì vậy, một số viết lại đã xảy ra, nhưng vẫn có điều gì đó không ổn.
Vì vậy, câu hỏi của tôi là - làm thế nào tôi có thể nói với Apache, với proxy mọi thứ từ ứng dụng trên 127.0.0.1:8080, đến thứ gì đó xuất hiện dưới dạng "thư mục con" (URL tương đối? tại đây /hàm
)?
Chỉnh sửa: hóa ra, Lỗi 502 Proxy là do:
AH00898: Lỗi tra cứu DNS cho: 127.0.0.1:6789static được trả về bởi /poll/static/js/html.js
... rõ ràng là thiếu một dấu gạch chéo; vì vậy nó đã kết thúc rằng điều này:
ProxyPass /jaw/ http://127.0.0.1:8080/
ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
<Vị trí /hàm/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080/
ProxyHTMLBật Bật
ProxyHTMLURLMap / /jaw/
</Vị trí>
... thực sự hoạt động - phần lớn (phần /tĩnh
tài nguyên); nhưng sau đó, có một cuộc gọi đến /dữ liệu
điều đó không được xử lý bởi điều này ... Vì vậy, đây vẫn là một câu hỏi mở (đối với tôi) về cách ủy quyền "mọi thứ"