代码之家  ›  专栏  ›  技术社区  ›  Frantisek

如何在一台服务器上正确处理多个VirtualHost,而只有一台服务器具有SSL?

  •  0
  • Frantisek  · 技术社区  · 11 年前

    我有以下apache2 VirtualHost配置:

    <VirtualHost {my_server_ip}:443>
     ServerName securesite.com
     ServerAlias www.securesite.com
     DocumentRoot /data/web/securesite.com/
     Options -Indexes
     SSLEngine On
     SSLCertificateFile /etc/ssl/securesite.com/securesite.com.crt
     SSLCertificateKeyFile /etc/ssl/securesite.com/server.key
     SSLCertificateChainFile /etc/ssl/securesite.com/gd_bundle.crt
    </VirtualHost>
    
    <VirtualHost *:80>
     DocumentRoot /data/web/unsecuresite.com/
     ServerName unsecuresite.com
     ServerAlias www.unsecuresite.com
    </VirtualHost>
    

    问题是我可以访问 https://unsecuresite.com/ 并且服务器返回 securesite.com 并且浏览器抱怨。

    为什么会发生这种情况?为什么ServerName for 443与其他服务器名称匹配?

    我能处理好吗?也许可以捕获请求,用正则表达式处理它并将其重定向到正确的位置?

    编辑

    ports.conf 说:

    NameVirtualHost *:80
    Listen 80
    
    <IfModule mod_ssl.c>
        NameVirtualHost {my_server_ip}:443
        Listen 443
    </IfModule>
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   Lekensteyn    11 年前

    当您连接到 https://securesite.com/ ,那么您实际上正在连接到端口443。由于只有一个站点在端口443上侦听,因此返回第一个匹配(即使ServerName不匹配)。

    您的配置基本上归结为:

    <VirtualHost {my_server_ip}:443>
     ServerName securesite.com
     # ...
    </VirtualHost>
    
    <VirtualHost *:80>
     ServerName unsecuresite.com
     # ...
    </VirtualHost>
    

    这意味着对端口80的任何请求( http )将由 unsecuresite.com 并请求端口443( https )由提供服务 securesite.com .

    即使您添加了 <VirtualHost *:443> ServerName unsecuresite.com ,您仍然不能简单地欺骗用户在没有有效证书的情况下重定向 unsecuresite.com网站 。(这将导致一个难看的证书警告。)

    如果您的 unsecuresite.com网站 vhost不应该处理HTTPS,那么就忽略它。如果主机名不匹配,可以使用nginx重置连接,我不知道Apache是否存在类似的情况。

        2
  •  0
  •   Frantisek    11 年前

    我用以下方法解决了这个问题:

    <VirtualHost {my_server_ip}:443>
     ServerName securesite.com
     ServerAlias www.securesite.com
     DocumentRoot /data/web/securesite.com/
     Options -Indexes
     SSLEngine On
     SSLCertificateFile /etc/ssl/securesite.com/securesite.com.crt
     SSLCertificateKeyFile /etc/ssl/securesite.com/server.key
     SSLCertificateChainFile /etc/ssl/securesite.com/gd_bundle.crt
     RewriteEngine on
     RewriteCond %{HTTP_HOST} !^(www\.)?(securesite\.com){1}$ [NC]
     RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [R=301]
    </VirtualHost>