在除根path以外的所有URL上使用ProxyPassMatch

我已经search了很高的解决scheme,希望只是我。 我想要做的是将所有stream量从我们托pipe的URLredirect到由我们购买的另一个提供商托pipe的另一台服务器,以便我们可以自定义根URL。

我正在使用httpd 2.2.3(Apache)。 这是在一个VirtualHost部分configuration的,它也是SSL(我不认为这应该很重要)。

一切都很好,除了排除。

我有(简化)是:

ProxyPreserveHost On <VirtualHost 1.2.3.4:443> SSLProxyEngine On ProxyPassMatch ^/$ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1 ProxyPassReverse / https://proxy.example.com/ SSLEngine on ... </VirtualHost> 

但是它总是去远程站点。 我已经尝试了一堆组合,如:

     ProxyPassMatch / $!
     ProxyPassMatch ^ /(。*)$ https://proxy.example.com/$1
     ProxyPassMatch com /!
     ProxyPassMatch ^ /(。*)$ https://proxy.example.com/$1

我也尝试了另一种方式(在/之后与任何东西匹配,即:

     ProxyPassMatch ^ /(.. +)$ https://proxy.example.com/$1
     ProxyPassMatch /!
     ProxyPassMatch ^ /(.. *)$ https://proxy.example.com/$1
     ProxyPassMatch /!

现在的文档说它匹配的URL,但我没有发现证据,这是它实际上做了什么(即:与com /上面的第二个变种)。

我也尝试了一些其他的组合,或者匹配一切,或者什么都不匹配。

我的想法是我不理解获得正则expression式的URL,但不知道如何看待它。 我已经调出了Apache的debugging级别进行debugging ,也没有给出任何有用的东西。

干杯。

我想出了一个答案,或更多的解决方法:使用另一台服务器(在这种情况下本地服务器仍然在同一个httpd实例)。

即:上面的行现在阅读:

 ProxyPassMatch ^/$ 127.0.0.1:81 ProxyPassMatch ^/(.*)$ proxy.example.com/$1 

(加上通常的主机configuration在新端口上运行,并在该端口上configuration虚拟主机)。 这有点乱,但似乎把它整理出来!

我仍然渴望知道自己是否做了错误的事情,并且有一个“正确的”答案 – 因为我认为这有些黑客。

如果我不得不猜测,我会说你的问题来自“^ /。* $”匹配,匹配“/”。 如果您将明确的匹配删除了/并用“^ /。+ $”replace了代理通行证,则可能会解决您的问题。 没有承诺,但。

不同之处在于*相当于{0,},而+相当于{1,},因此。*将匹配任何或不包含字符,而您至less需要一个匹配。