Перезапис URL-адрес Apache у зворотній проксі


12

Я розгортаю Apache перед додатком, розміщеним у Карафі (Apache та Karaf є на окремих серверах). Я хочу, щоб Apache працював як зворотний проксі, а також приховував частину URL-адреси.

URL-адреса для отримання сторінки входу програми безпосередньо з сервера додатків є http://app-server:8181/jellyfish. Сторінки обслуговуються екземпляром Jetty, що працює в Карафі. Звичайно, брандмауер зазвичай блокує таку поведінку, окрім зворотного проксі-сервера.

Якщо брандмауер вимкнений, якщо ви потрапили на цю URL-адресу, тоді Jetty завантажує сторінку входу. Адресна панель браузера правильно змінюється http://app-server:8181/jellyfish/login?0і все працює.

Я хочу, щоб http://web-server(тобто з коренем) відобразити карту Jetty на сервері додатків із jellyfishпридушеним ім'ям програми ( ). наприклад, браузер зміниться, щоб відображатися http://web-server/login?0в адресному рядку, і всі наступні URL-адреси та вміст подаватимуться з доменом веб-сервера та без jellyfishзахаращення.

Я можу змусити Apache працювати як простий зворотний проксі, використовуючи таку конфігурацію (фрагмент): -

ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/

... але для цього потрібно, щоб URL-адреса браузера містила, jellyfishі перехід до кореневої URL-адреси ( http://web-server) дає 404 Not Found.

Я витратив чимало часу, намагаючись mod_rewriteз цим [P]прапором використати і без нього , але без успіху. Тоді я спробував цю ProxyPassMatchдирективу, але, здається, не цілком коректний.

Ось поточна конфігурація, завантажена /etc/apache2/sites-available/на веб-сервер. Зауважте, що існує локальний каталог зображень. Я також дотримувався захисту захисту від проксі mod_rewrite і пригнічую пару mod_securityправил, які давали помилкові позитиви.

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

Якщо я переходжу до http://web-serverмене, я переспрямовуюсь, http://web-server/jellyfish/homeале це дає 404, із скаргою на спробу доступу /jellyfish/jellyfish/home- НЕ зверніть увагу, що адресна панель браузера не містить подвійного /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

І якщо я піду до http://web-server/loginмене, я переспрямовуюсь, http://web-server/jellyfish/login?0але це дає номер 404 із скаргою на спробу доступу /jellyfish/jellyfish/login.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

Отже, я здогадуюсь, що я якось двічі проходжу правила. Я також трохи збентежений, звідки homeпоходить біт URL-адреси в першому прикладі.

Чи може хтось вказати мені в правильному напрямку, будь ласка?

Дякую, Дж.


Я досяг певного прогресу в цьому, і тепер замінив його ProxyPassMatchна еквівалентне використання mod_rewrite, яке вирішує проблему видалення jellyfishз URL-адрес. Зараз я розглядаю кількість 404-х, які потім спливають стосовно основних елементів, таких як компоненти Віккету, необхідні Карафу. Ось фрагмент коду:# 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/
Джеремі Гуч

Відповіді:


10

Ось як я змусив його працювати. Окрім змін, що стосуються мого коментаря до мого оригінального запитання, мені потрібно було виключити .jsта .cssз правила, що додало прорізну косу рису.

<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

Ти намагався:

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

Або ще простіше:

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

Я написав, як я маю справу з Apache зворотним проксі і Tomcat тут, якщо ви хочете порівняти / порівняти те, що ви налаштовуєте, з тим, що я використовую.

Ви можете додати це, щоб додати кінцеву косу рису в URL:

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

Велике спасибі за відповідь. На жаль, це вирішує лише пряму частину проблеми. Біт, який мені не вистачає, полягає в тому, як видалити слово "медуза" з видимості в адресному рядку браузера клієнта, таким чином, щоб http://web-serverмовчки потрапляти в проксі http://app-server:8181/jellyfishі знову.
Джеремі Гуч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.