用于URLS的Apache ProxyPass不一致地失败

时间:2012-11-21 18:46:02

标签: apache tomcat ajp proxypass

这个让我疯狂。我有一个活跃的,正在使用的Apache代理服务器,在EC2上提供内容。它工作得很好,并且有各种各样的vhost配置如下:

<VirtualHost *:80>
    ServerName m.FOO.com
    ServerAlias customer.FOO.com

    ProxyPreserveHost On
    ProxyPass / ajp://10.211.42.48:8009/
    ProxyPassReverse / ajp://10.211.42.48:8009/

    <Proxy ajp://10.211.42.48:8009/*>
          Order allow,deny
          Allow from all
    </Proxy>
</VirtualHost>

这些都很棒,我没有问题。现在我想要做的是移动它而不是每个应用程序的单个vhost,我想在主站点上有一个子url代理回到appserver。因此,不是客户拥有'customer.FOO.com',他们将拥有'FOO.com/customer /'

太好了,听起来很简单,对吧?是的,不是那么多。我编辑服务器的“root”的vhost条目(当前显示登录页面),并将代理条目添加到其中的目录中。应该这样做,对吗?是的,它不是:

<VirtualHost *:80>
    ServerName web01.aws.FOO.com
    DocumentRoot /var/www/html
    ErrorLog logs/www.FOO.com-error_log
    CustomLog logs/www.FOO.com-access_log common

    <Location /a>
            ProxyPass ajp://10.211.42.48:8009
            ProxyPassReverse ajp://10.211.42.48:8009
    </Location> 

    <Location /t>
            ProxyPass http://adm01
            ProxyPassReverse http://adm01
    </Location>

    <Proxy ajp://10.211.42.48:8009/*>
          Order allow,deny
          Allow from all
    </Proxy>

</VirtualHost>

如果我点击http://www.FOO.com/t/ - 我得到了内部网络服务器 - 它正确地向前发送,一切都很顺利。如果我点击http://www.FOO.com/a/,我会收到404错误。访问日志甚至显示404错误。

请注意,ProxyPass AJP条目与其他vhost条目中的条目相同。那么为什么它在另一个vhost条目的root上工作,而不是作为主vhost上的子目录?

HALP!

1 个答案:

答案 0 :(得分:1)

我最后通过某个特定提示来解决这个问题,我在某个地方的邮件列表中找到了这个提示。 ProxyPassReverse指令非常敏感,并且具有一个基本功能。它在第二个参数上匹配的任何内容(假设使用ProxyPassReverse A B形式)将应用于第一个参数。因此,确保第二个参数完全是来自应用程序的重定向至关重要,否则将忽略ProxyPassReverse指令。

在我的情况下,我最终做的是将Location条目更改为:

ProxyPass /a/ ajp://10.211.42.48:8009
ProxyPassReverse /a/ http://my.apphost.com/

所有人都开始工作得很好。