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