反向代理中的Apache URL重写


12

我将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为等效的using mod_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/
Jeremy Gooch 2013年

Answers:


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往返。
杰里米·古奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.