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?0và 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?0trê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ị jellyfishlộ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 jellyfishvà đ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_rewritecó 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ử ProxyPassMatchchỉ 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_securityquy 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/homenhư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?0như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 homebit 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.
ProxyPassMatchbằng cách sử dụng tương đươngmod_rewrite, giải quyết thách thức xóajellyfishkhỏ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/