我想将子域名反向代理到具有相同主机名的另一个域名。
例子:
fitzefatze.sourcedomain.com 应获取以下内容:
fitzefatze.targetdomain.com
这应该是动态的,以便每个主机名都将被转换为目标域名。
我猜这可以通过 ProxyPass 指令来完成,但我不知道如何获取目标的主机名:
类似于 ServerName *.sourcedomain.com
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all #
</Proxy>
ProxyPass / $1.targetserver.com
答案1
有 ProxyPassMatch 指令,但它确实指定了以下限制:
URL 参数在正则表达式替换之前(以及之后)必须可解析为 URL。这限制了您可以使用的匹配项。例如,如果我们使用了
代理密码匹配 ^(/.*.gif)$http://backend.example.com:80001 美元
在我们之前的例子中,它会在服务器启动时因语法错误而失败。这是一个错误(ASF bugzilla 中的 PR 46665),解决方法是重新制定匹配:
ProxyPassMatch ^/(.*.gif)$http://backend.example.com:8000/1 美元
我不知道在替换之前它是否会接受 http://$1.targetserver.com 作为有效的 URL——尝试一下并告诉我们!
正如 Shane 所说,您也可以使用 mod_rewrite,但您应该知道 mod_rewrite 完成的代理不使用连接池——每个新请求都会动态创建一个新的代理连接。因此,您将无法从 ProxyPass 完成的持久连接池中受益,也无法使用 ProxyPass 提供的每个连接池选项(keepalive、timeout、connectiontimeout、retry、min/max 等)微调其行为。
请注意,对于这两种替代方案,似乎都没有匹配的 ProxyPassReverseMatch 指令。
答案2
为此,您需要使用mod_rewrite
..
RewriteCond %{HTTP_HOST} ^(.*)\.sourcedomain\.com$
RewriteRule ^/(.*)$ http://%1.targetdomain.com/$1 [P,L]
..请记住,ProxyPassReverse
在这里不起作用所以任何30x
回应都不会被翻译。