Apache 代理:为什么一个虚拟主机返回“Forbidden”,而另一个虚拟主机可以正常工作?

Apache 代理:为什么一个虚拟主机返回“Forbidden”,而另一个虚拟主机可以正常工作?

我有一个 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 消息。

另一个虚拟主机“意外地”工作了,因为其名称与机器的主机名相匹配。

相关内容