我将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/