web-dev-qa-db-ja.com

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

私は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とコンテンツは、jellyfishクラッターなしでWebサーバーのドメインで提供されます。

次の構成(スニペット)を使用して、Apacheを単純なリバースプロキシとして動作させることができます。

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

...しかし、これにはブラウザのURLにjellyfishを含める必要があり、ルートURL(http://web-server)にアクセスすると404が見つかりません。

これを回避するためにmod_rewriteフラグを付けて、または付けずに[P]を使用することに多くの時間を費やしましたが、成功しませんでした。次にProxyPassMatchディレクティブを試してみましたが、それを完全に正しくすることもできません。

これは、Webサーバーの/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-NBブラウザのアドレスバーに二重/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回通過していると思います。最初の例では、URLのhomeビットがどこから来ているかについても少し戸惑っています。

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

ありがとう、J。

12
Jeremy Gooch

これは私がそれを機能させた方法です。元の質問に対する私のコメントによる変更と同様に、末尾のスラッシュを追加するルールから.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>
10
Jeremy Gooch

やってみました:

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]
1
JakeGould