Viết lại URL Apache trong proxy ngược


12

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.


Tôi đã thực hiện một số tiến bộ về vấn đề này và hiện đã thay thế ProxyPassMatchbằng cách sử dụng tương đương mod_rewrite, giải quyết thách thức xóa jellyfishkhỏ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/
Jeremy Gooch

Câu trả lời:


10

Đây là cách tôi làm cho nó hoạt động. Cũng như những thay đổi theo nhận xét của tôi đối với câu hỏi ban đầu của tôi, tôi cần loại trừ .js.csskhỏi quy tắc có thêm dấu gạch chéo.

<VirtualHost *:80>
    ServerAdmin admin@localhost
    ServerName mydomain.com
    ServerAlias www.mydomain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteLog ${APACHE_LOG_DIR}/rewrite.log
    RewriteLogLevel 9

    Alias /images/ "/var/www/images/"

    RewriteEngine On

    # rewrite rule to prevent proxy exploit
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    # consolidate non-www requests onto the www subdomain
    RewriteCond  %{HTTP_HOST}    ^yourdomain\.com$
    RewriteRule  ^(.*)           http://www.yourdomain.com/$1  [R=301,L]

    # Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteCond  %{REQUEST_URI}  !^/(.*)(.js|.css)$
    RewriteCond  %{REQUEST_URI}  !(.*)/$
    RewriteRule  ^(.*)$          http://%{HTTP_HOST}$1/ [R=301,L]

    # 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/

    # suppress mod_security rules that were giving false positives
    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

</VirtualHost>

1

Bạn đã thử chưa:

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

Hoặc thậm chí đơn giản hơn:

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

Tôi đã viết lên cách tôi đối phó với proxy ngược của Apache và Tomcat ở đây nếu bạn muốn so sánh / đối chiếu những gì bạn thiết lập với những gì tôi sử dụng.

Bạn có thể muốn thêm phần này để thêm dấu gạch chéo vào URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]

Rất cám ơn bạn đã trả lời. Thật không may, điều này chỉ giải quyết phần ủy quyền đơn giản của vấn đề. Điều tôi thiếu là làm thế nào để loại bỏ từ "sứa" khỏi tầm nhìn trong thanh địa chỉ trình duyệt của khách hàng, để http://web-serverâm thầm được ủy nhiệm http://app-server:8181/jellyfishtrở lại.
Jeremy Gooch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.