我将Apache部署在Karaf托管的应用程序之前(Apache和Karaf在单独的服务器上)。我希望Apache充当反向代理,并且还隐藏URL的一部分。
直接从应用服务器获取应用程序登录页面的URL是http://app-server:8181/jellyfish
。页面由Karaf中运行的Jetty实例提供服务。当然,除了反向代理服务器之外,所有防火墙都通常会阻止此行为。
在关闭防火墙的情况下,如果您单击此URL,则Jetty会加载登录页面。浏览器的地址栏正确更改为http://app-server:8181/jellyfish/login?0
,一切正常。
我想要的是http://web-server
(即从根目录)映射到应用服务器上的Jetty,而jellyfish
取消了应用的名称()。例如,浏览器将更改为显示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
所以,我猜我在某种程度上两次通过了规则。home
对于第一个示例中的URL的来源,我也感到有些困惑。
有人可以指出我正确的方向吗?
谢谢,J。
ProxyPassMatch
为等效的usingmod_rewrite
,以解决jellyfish
从URL 中删除的挑战。我现在正在研究大量404,然后针对诸如Karaf所需的Wicket组件之类的基本元素弹出。这是一个代码段:# 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/