对于后端服务器中的Java应用程序,我们目前正在运行Apache Reverse Proxy(仅限转发),无需身份验证 . 这将是工作方式:

Internet <---> Apache Reverse Proxy <----> Java Application Server

从Internet访问客户端的URL:example.com/java-app

通过代理访问Java应用程序工作正常,我们可以浏览应用程序并使用它没有任何问题或bug .

我的问题:

Java应用程序在内部发出一些请求从外部网站获取一些数据,在这种情况下,是从公共PGP服务器获取密钥,但Java应用程序收到404错误 . Java应用程序使用常规GET java.net.HttpURLConnection到URL

http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on.

检查日志后,显然我们的代理服务器正在考虑将外部URL(http://pgp.uni-mainz.de)视为本地URL,因为我在日志中发现了这一点:

AH02417: Replacing host header 'pgp.uni-mainz.de' with host 'pgp.uni-mainz.de' given in the request uri
AH01626: authorization result of Require all granted: granted
AH01626: authorization result of <RequireAny>: granted
AH00128: File does not exist: /var/www/pks/lookup

在代理服务器中运行wireshark后,我确认我的apache代理没有发送请求,因为我发现了这个

1528378541.404289000|192.x.x.x|54641|192.x.x.x|80|HTTP/1.1|GET|pgp.uni-mainz.de|http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on|Java/1.8.0_162|||||

1528378541.405104000|192.x.x.x|80|192.x.x.x|54641|HTTP/1.1|||||404|text/html; charset=iso-8859-1|290||

只需提一下,我可以从运行Java应用程序的后端服务器以及运行Apache代理服务器的服务器成功地卷曲/获取URL .

http://pgp.uni-mainz.de/pks/lookup?search=%3Cusername@example.com%3E&op=index&options=mr&exact=on

这是我对该网站的代理配置,正如您所看到的,非常简单且前进,并且对于Java应用程序的访问工作正常:

SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
ProxyRequests Off
ProxyVia Off

<Proxy *>
        Require all granted
</Proxy>

ProxyPreserveHost On
AllowEncodedSlashes On
ProxyRequests Off

ProxyPass /synchrony http://backend-server.example.com:8091/synchrony

<Location /synchrony>
        Require all granted
        RewriteEngine on
        RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
        RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
        RewriteRule .* ws://backend-server.example.com:8091%{REQUEST_URI} [P]
</Location>

ProxyPass /java-app https://backend-server.example.com:8093/java-app nocanon
ProxyPassReverse /java-app https://backend-server.example.com:8093/java-app

<Location /java-app/>
        Require all granted
</Location>

Java应用程序以一些参数启动,让它知道在代理后面运行,并且这个java应用程序的其他功能正常运行,没有任何问题 . 这将是Java配置:

JVM_SUPPORT_RECOMMENDED_ARGS="-Dhttp.proxyHost=example.com -Dhttp.proxyPort=80 -Dhttps.proxyHost=example.com -Dhttps.proxyPort=443 -Dhttp.nonProxyHosts=\"backend-server.example.com|localhost|127.0.0.1|192.x.x.x|proxy-server.example.com|*java-app\""

我尝试修改代理配置,比如ProxyPreserveHost,但我没有成功 . 哪里可能是问题?

非常感谢 .