我有一种情况,我可以直接从主机或本地网络访问私有 NAT-ed apache2.4 / tomcat7.0 railo4.2 服务器,但是当通过 SSH 远程端口转发隧道时,应用程序会因错误而中断:
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /.
Reason: DNS lookup failure for: server-dev:5555
显而易见的答案是 server-dev 是一个不可解析的主机名,但这里不应该是这种情况,因为lynx server-dev:80
在服务器本地或子网上的 LAN 机器上工作(名称通过客户端和服务器上的 /etc/hosts 解析)。apache 提供的静态页面也可以工作,错误似乎出现在 Tomcat 端或 AJP 连接器中。我自己从 2.4.9 源代码和 1.5.1 年编译了 apache。唯一似乎在端口转发时出现。
Apache 错误日志显示:
[Tue Jun 24 22:37:06.911541 2014] [proxy:error] [pid 16858] [client 10.10.10.15:63398] AH00898: DNS lookup failure for: server-dev:5555 returned by /
没有什么值得注意的catalina.out
或我能看到的任何其他日志。
相关的apache配置是:
<VirtualHost *:80>
ServerName server-dev
UseCanonicalName On
RewriteCond %{REQUEST_FILENAME} /[^/:]+\.cfml*($|/)
RewriteRule (.*) ajp://%{HTTP_HOST}:8009$1 [P,L]
</VirtualHost>
SSH 隧道是从第三个“中间人”系统 (10.10.10.15) 使用 PuTTY 创建的,设置如下:
Remote: 5555
Local: 10.10.10.101:80
服务器上的相关 /etc/hosts 条目(它没有绑定/dnsmasq):
10.10.10.101 server-dev # servers private ip
似乎是主机文件被忽略并且正在尝试 DNS 解析,或者 5555 端口号以某种方式混淆了它(就像它认为它是主机名的一部分),尽管我想不出任何一个好的理由即将发生。
我发现了问题。
%{HTTP_HOST}
在端口不是 80 的情况下,它看起来也包含端口号,因此规则被评估为RewriteRule (.*) ajp://server-dev:5555:8009$1 [P,L]
.简单的解决方案:看起来
%{SERVER_NAME}
变量不包含端口。所以有效的规则是
警告:我忘记了 HTTP_HOST 和 SERVER_NAME 根据客户端浏览器发送的域而有所不同。我实际上需要 HTTP_HOST 但不是端口,所以实际的解决方案是https://stackoverflow.com/questions/11553939/rewriterule-using-http-host-and-a-different-port