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

Sil*_*rog 2 proxypass apache-2.2

我已经为此寻找了一个解决方案,希望这只是我。我想要做的是将所有流量从我们托管的 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>
Run Code Online (Sandbox Code Playgroud)

但是,它总是转到远程站点。我尝试了一堆组合,例如:

    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/ 的第二个变体)。

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

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

干杯。

小智 5

如果我不得不猜测,我会说您的问题来自“^/.*$”匹配,它将匹配“/”。如果您放弃与 / 的显式匹配并将代理传递替换为“^/.+$”,则可能会解决您的问题。虽然没有承诺。

区别在于 * 等效于 .{0,} 而 + 等效于 .{1,},因此 .* 将匹配任何字符或匹配任何字符,而您希望匹配至少一个字符。

即:该行应为:

ProxyPassMatch ^/(.+)$ proxy.example.com/$1
Run Code Online (Sandbox Code Playgroud)