我有一个运行 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 错误。