我到处寻找解决方案,希望只有我一个人遇到这种情况。我试图将我们托管的 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
(加上在新的端口上运行的常用主机配置,以及该端口上的虚拟主机配置)。有点混乱,但似乎已经解决了!
我仍然渴望知道我是否做错了什么,并且对此有一个“正确”的答案 - 因为我认为这有点像黑客行为。