我刚刚在内部 Windows Server 2012 R2 服务器上配置了 Microsoft 远程桌面服务。我可以通过端口转发从网络外部访问 RDP。但是,由于我在端口 80/443 上运行了其他 Web 服务器,因此我无法将 IIS 上运行的 RD Web 访问直接公开到互联网。
我为所有内部站点都配置了 Apache 反向代理,因此我尝试将其用于 RD Web 访问。我的配置(针对 HTTP 和 HTTPS)如下
<VirtualHost *:80>
ServerName foo.example.com
ProxyPass / http://192.168.1.xxx/
ProxyPassReverse / http://192.168.1.xxx/
</VirtualHost>
此配置似乎有效,但存在问题。当直接连接到 时foo.example.com
,我得到了默认的 IIS 页面,正如预期的那样。但是,当访问 时http://foo.example.com/RDWeb/
,URL 会更改为http://192.168.1.xxx/RDWeb
,显然我无法从我的网络外部访问它。我需要它保持为http://foo.example.com/RDWeb/
。
我尝试添加ProxyPreserveHost On
到我的 Apache 配置中,当我这样做时,我得到了一个无限的重定向循环,所以这也不起作用。我很确定这是不是IIS 问题,因为如果我将本地主机文件设置为指向foo.example.com
,192.168.1.xxx
它就可以正常工作。
我的 Apache 反向代理配置中是否缺少了什么?
答案1
好吧,经过顿悟之后,我找到了问题的根源。
事实证明,我确实应该继续ProxyPreserveHost On
允许 URL 重写到正确的外部 URL。但是,由于我的外部 URL 有 SSL 证书,因此我得到了无限重定向循环,如下所示
External URL (https) -> Internal (http) -> Internal (https) -> External (https)
我通过将ProxyPass
和ProxyPassReverse
指令转换为代理 HTTPS 而不是 HTTP 内部 IP 来修复此问题。因此,我还必须添加指令SSLProxyEngine On
。