我有一个 Java 应用程序需要使用 HTTPS 与另一个内部网网站进行双向通信。在与 Java 的 SSL 实现斗争了一段时间后,我放弃了这个念头,现在我设置了一个 Apache,它应该充当双向反向代理:
external app ---(HTTPS request)---> Apache ---(local HTTP request)---> Java app
这个方向工作正常,但是另一个方向却不行:
Java app ---(local HTTP request)---> Apache ---(HTTPS request)---> external app
这是实现第二个代理的 vhost 的配置:
Listen 127.0.0.1:8081
<VirtualHost appgateway:8081>
ServerName appgateway.local
SSLProxyEngine on
ProxyPass / https://externalapp.corp:443/
ProxyPassReverse / https://externalapp.corp:443/
ProxyRequests Off
AllowEncodedSlashes On
# we do not need to apply any more restrictions here, because we listened on
# local connections only in the first place (see the Listen directive above)
<Proxy https://externalapp.corp:443/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
Acurl http://127.0.0.1:8081/
应提供与 等效的功能https://externalapp.corp
,但结果却是403 Forbidden
,Apache 错误日志中出现以下消息:
[Wed Jun 04 08:57:19 2014] [error] [client 127.0.0.1] Directory index forbidden by Options directive: /srv/www/htdocs/
这条消息让我完全困惑:是的,我没有在这个虚拟主机的 DocumentRoot 上设置任何权限,但对于我没有设置权限的其他代理方向,一切正常。作为参考,这是另一个虚拟主机:
Listen this_vm_hostname:443
<VirtualHost javaapp:443>
ServerName javaapp.corp
SSLEngine on
SSLProxyEngine on
# not shown: SSLCipherSuite, SSLCertificateFile, SSLCertificateKeyFile
SSLOptions +StdEnvVars
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
ProxyRequests Off
AllowEncodedSlashes On
# Local reverse proxy authorization override
<Proxy http://localhost:8080/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
答案1
我找到了问题所在。这是以下<VirtualHost>
语句:
<VirtualHost appgateway:8081> # broken
<VirtualHost *:8081> # works
由于 VirtualHost 规范错误,HTTP 请求与虚拟主机不匹配。由于没有可用的主机,因此使用了默认主机配置,该配置没有有效的DocumentRoot
,因此显示 Forbidden 消息。
另一个虚拟主机“意外地”工作了,因为其名称与机器的主机名相匹配。