反向代理中的 Apache URL 重写

反向代理中的 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(即从根目录)映射到应用服务器上的 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 浏览器的地址栏不包含双重/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。

答案1

这就是我让它工作的方法。除了按照我对原始问题的评论所做的更改外,我还需要从添加尾部斜杠的规则中排除.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>

答案2

你有没有尝试过:

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]

相关内容