Tôi đang triển khai Apache trước một ứng dụng được lưu trữ trên Karaf (Apache và Karaf nằm trên các máy chủ riêng biệt). Tôi muốn Apache hoạt động như một proxy ngược và cũng để ẩn một phần của URL.
URL để nhận trang đăng nhập của ứng dụng trực tiếp từ máy chủ ứng dụng là http://app-server:8181/jellyfish
. Các trang được phục vụ bởi phiên bản Jetty chạy trong Karaf. Tất nhiên, hành vi này thường sẽ bị chặn bởi tường lửa cho mọi thứ trừ máy chủ proxy ngược.
Khi tắt tường lửa, nếu bạn nhấn URL này thì Jetty sẽ tải trang đăng nhập. Thanh địa chỉ của trình duyệt thay đổi chính xác http://app-server:8181/jellyfish/login?0
và mọi thứ hoạt động.
Những gì tôi muốn là http://web-server
(tức là từ thư mục gốc) để ánh xạ tới Cầu tàu trên máy chủ ứng dụng với tên của ứng dụng ( jellyfish
) bị chặn. ví dụ: Trình duyệt sẽ thay đổi để hiển thị http://web-server/login?0
trên thanh địa chỉ và tất cả các URL và nội dung tiếp theo sẽ được cung cấp với tên miền của máy chủ web và không bị jellyfish
lộn xộn.
Tôi có thể khiến Apache hoạt động như một proxy ngược đơn giản, sử dụng cấu hình sau (đoạn trích): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... nhưng điều này đòi hỏi URL của trình duyệt phải chứa jellyfish
và đi tới URL gốc ( http://web-server
) cung cấp 404 Không tìm thấy.
Tôi đã dành rất nhiều thời gian để cố gắng sử dụng mod_rewrite
có và không có [P]
cờ của nó để khắc phục điều này, nhưng không thành công. Sau đó tôi đã thử ProxyPassMatch
chỉ thị, nhưng dường như tôi cũng không thể hiểu đúng.
Đây là cấu hình hiện tại, như được tải vào /etc/apache2/sites-available/
máy chủ web. Lưu ý rằng có một thư mục hình ảnh được lưu trữ cục bộ. Tôi cũng đã giữ bảo vệ khai thác proxy mod_rewrite và đang loại bỏ một số mod_security
quy tắc đưa ra kết quả dương tính giả.
<VirtualHost *:80>
ServerAdmin admin@drummer-server
ServerName drummer-server
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /images/ "/var/www/images/"
RewriteEngine On
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
ProxyPass /images !
ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
ProxyPassReverse / http://granny-server:8181/jellyfish
ProxyPreserveHost On
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Nếu tôi đi đến http://web-server
, tôi sẽ được chuyển hướng đến http://web-server/jellyfish/home
nhưng điều này mang lại 404, với một khiếu nại về việc cố gắng truy cập /jellyfish/jellyfish/home
- NB thanh địa chỉ của trình duyệt không chứa gấp đôi /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
Và, nếu tôi đi đến http://web-server/login
, tôi được chuyển hướng đến http://web-server/jellyfish/login?0
nhưng điều này mang lại 404, với một khiếu nại về việc cố gắng truy cập /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Vì vậy, tôi đoán rằng bằng cách nào đó tôi đã thông qua các quy tắc hai lần. Tôi cũng hơi bối rối về việc home
bit của URL đến từ ví dụ đầu tiên.
Ai đó có thể chỉ cho tôi đi đúng hướng không?
Cảm ơn, J.
ProxyPassMatch
bằng cách sử dụng tương đươngmod_rewrite
, giải quyết thách thức xóajellyfish
khỏi URL. Bây giờ tôi đang xem xét một số 404 sau đó bật lên liên quan đến các yếu tố cơ bản như các thành phần Wicket được Karaf yêu cầu. Đây là đoạn mã:# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/