目标:
我testing了所有3个目标,它工作正常。
问题:
代码只包含重要的部分。
NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80> show error page </VirtualHost> <VirtualHost *:443> SSLCertificateFile san.crt CustomLog san-access.log ProxyPass / http://my-local-url-server/ ProxyPassReverse / http://my-local-url-server/ </VirtualHost> <VirtualHost *:443> ServerName myurl1.server.com SSLCertificateFile myurl1.crt CustomLog myurl1-access.log ProxyPass / http://mybackend1/ ProxyPassReverse / http://mybackend1/ </VirtualHost> <VirtualHost *:443> ServerName myurl2.server.com SSLCertificateFile myurl2.crt CustomLog myurl2-access.log ProxyPass / http://mybackend2/ ProxyPassReverse / http://mybackend2/ </VirtualHost>
这里的困惑是在SSL协商和Apache虚拟主机处理之间。 这是发生了什么事情:
如果用户在不支持SNI的情况下连接,Apache不能首先知道用户想要哪个虚拟主机,因为主机名隐藏在SSLencryption中。 所以apache将使用它为SSL协商find的第一个SSL证书。 一旦客户端已经接受了这个证书并且完成了协商,那么Apache将能够解密请求并且处理它,就好像客户端从一开始就被支持了SNI一样。
所以从来没有任何HTTP请求到SAN服务器 – 只有一个SSL协商,它使用来自SAN服务器的证书,然后找出哪个虚拟主机用于HTTP请求。 Apache只loggingHTTP请求,而不是SSL协商。