リバースプロキシでのApache URLの書き換え


12

Karafがホストするアプリケーションの前にApacheをデプロイしています(ApacheとKarafは別々のサーバーにあります)。Apacheをリバースプロキシとして動作させ、URLの一部を非表示にしたいのです。

アプリケーションサーバーからアプリケーションのログインページを直接取得するためのURLはhttp://app-server:8181/jellyfishです。ページはKaraf内で実行されているJettyインスタンスによって提供されます。もちろん、この動作は通常、リバースプロキシサーバーを除くすべてのファイアウォールによってブロックされます。

ファイアウォールをオフにして、このURLにアクセスすると、Jettyはログインページをロードします。ブラウザのアドレスバーが正しく変更されhttp://app-server:8181/jellyfish/login?0、すべてが機能します。

私が望んでいるのは、http://web-server(ルートから)アプリの名前(jellyfish)を抑制して、アプリサーバー上のJettyにマップすることです。たとえば、ブラウザはhttp://web-server/login?0アドレスバーに表示されるように変更され、後続のすべてのURLとコンテンツは、Webサーバーのドメインで、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/、Webサーバーにロードされる現在の構成です。ローカルにホストされている画像ディレクトリがあることに注意してください。また、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が表示されます。アクセスしようとすると苦情が出ます-NBのブラウザーのアドレスバーにはdoubleが含まれていません/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

だから、私は何らかの形でルールを2回通過していると推測しています。私はまたどこに困惑していますhome、最初の例でURLの一部がから来たのいます。

誰かが私を正しい方向に向けることができますか?

ありがとう、J


私はこれについていくつかの進歩を遂げましたが、現在はURLから削除するという課題に対処ProxyPassMatchする同等のusingに置き換えています。私は現在、Karafが必要とするWicketコンポーネントなどの基礎となる要素に関してポップアップする多くの404を調べています。ここでは、コードスニペットがあります:mod_rewritejellyfish# 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再びと。
ジェレミーグーチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.