Apache mod 代理到运行 VPN 的本地服务器

Apache mod 代理到运行 VPN 的本地服务器

我有一个运行 Apache 的开放服务器和一个也运行 Apache 的封闭服务器,该服务器位于防火墙后面并运行 VPN。

我正在尝试使用开放服务器将子域的请求转发到封闭服务器。 subdomain.request.com -> open server -> closest server

我的理解是,这可以通过使用 Apache 的 mod 代理来实现,但我在设置它时遇到了困难。我可以请求主页,但所有其他页面都会产生错误DNS lookup failure

虚拟主机

<VirtualHost *:80> ServerName subdomain.request.com ProxyPass / http://10.0.0.54:8080 ProxyPassReverse / http://10.0.0.54:8080 ProxyPassMatch ^/(.*)$ http://10.0.0.54:8080/$1i </VirtualHost>

答案1

Garreth 几乎是正确的,但你必须做相反的事情:

<VirtualHost *:80>
ServerName subdomain.request.com
RewriteEngine On
ProxyPreserveHost On
RewriteRule ^/(.*)$ http://10.0.0.54:8080/$1 [P,QSA,L]
</VirtualHost>

这样,位于 10.0.0.54 的服务器将收到原始的“Host:”标头(又名: subdomain.request.com ,而不是 10.0.0.54 ),并且由于位于 10.0.0.54 的服务器可能根据此标题创建链接这可能会解决您的问题。

我猜测您遇到的错误不是 DNS 错误而是网络错误,因为根据您的设置,服务器会生成如下 URL:http://10.0.0.54... 并且这些 URL 无法从互联网访问(因为 10.0.0.54 是您的 VPN 后面的专用网络)。

ProxyPreserveHost On的服务器将生成以下链接:http://subdomain.request.com...

答案2

在这种情况下,使用 mod_rewrite 中的代理函数 [P] 更容易

<VirtualHost *:80>
ServerName subdomain.request.com
RewriteEngine On
RewriteRule ^/(.*)$ http://10.0.0.54:8080/$1 [P,QSA,L]
</VirtualHost>

您还应该了解 ProxyPreserveHost 指令

ProxyPreserveHost On|Off

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypreservehost

如果您在代理上将其设置为开启,它会将您正在寻找的主机名传递给 mod_proxy,如果 mod_proxy 无法解析该主机名,它会给您一个 DNS 错误。

相关内容