对除根路径之外的所有 URL 使用 ProxyPassMatch

对除根路径之外的所有 URL 使用 ProxyPassMatch

我到处寻找解决方案,希望只有我一个人遇到这种情况。我试图将我们托管的 URL 上的所有流量重定向到另一台由我们购买的提供商管理的服务器,以便我们可以自定义根 URL。

我使用的是 httpd 2.2.3 (Apache)。这是在 VirtualHost 部分中配置的,它也是 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 匹配,但我没有发现任何证据表明它实际上是这样做的(即:上面的第二种变体网址:)。

我还尝试了许多其他组合,它们要么匹配所有内容,要么不匹配任何内容。

我的想法是,我不理解正则表达式给出的 URL,但不确定如何看待它。我已将 Apache 中的调试级别调高到调试,而且它也没有提供任何有用的东西。

干杯。

答案1

如果我不得不猜测,我会说你的问题来自“^/.*$”匹配,它将匹配“/”。如果你将显式匹配删除为/并将代理传递替换为“^/.+$”,则可能解决您的问题。但不保证。

不同之处在于 * 相当于 .{0,} 而 + 相当于 .{1,},因此 .* 将匹配任何或字符,而您希望至少匹配一个。

即:该行应为:

ProxyPassMatch ^/(.+)$ proxy.example.com/$1

答案2

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

即:上面的内容如下:

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

(加上在新的端口上运行的常用主机配置,以及该端口上的虚拟主机配置)。有点混乱,但似乎已经解决了!

我仍然渴望知道我是否做错了什么,并且对此有一个“正确”的答案 - 因为我认为这有点像黑客行为。

相关内容