在 https 域上设置子域的正确方法是什么?

在 https 域上设置子域的正确方法是什么?

假设我有以下 VirtualHost

<VirtualHost demo.example.com:80>
    ServerAdmin webmaster@WPQA
    DocumentRoot /var/www/demo
    ServerName demo.example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

<IfModule mod_ssl.c>    
<VirtualHost example.com:443>
    ServerAdmin webmaster@WPQA
    DocumentRoot /var/www
    ServerName example.com


    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on
    SSLCertificateFile  /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key
    SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch "MSIE [2-6]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0

    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

我正在尝试绕过 SSL demo.example.com,但是子域名返回的内容与相同example.com

我在这里做错什么了吗?

答案1

您的配置文件在端口 80 上设置了 demo.example.com(因此仅限 HTTP),并在端口 443 上设置了 example.com(仅限 HTTPS)。

请注意,即使你在 443 上设置它们,你也会遇到两个问题:

  1. 您不能在 example.com 和 demo.example.com 之间共享证书。典型/普通证书将覆盖空白域名和 www。(即 example.com 和 www.example.com),因此 demo.example.com 将被视为不相关,并将在浏览器中显示 SSL 错误。一种解决方案是购买通配符证书 *.example.com,这要昂贵得多,或者您需要为 demo.example.com 单独购买证书。

  2. 如果你获得了单独的证书,那么要托管 example.com 和 demo.example.com,你将需要使用名为服务器名称指示,不幸的是,它不适用于 IE/Windows XP 用户。这就是为什么它不经常使用的原因。您可以了解有关使用 Apache 设置 SNI 的更多信息这里。通配符域名不存在这个问题,但正如我之前提到的,缺点是它们更昂贵。

答案2

您的虚拟主机配置应该是:

<VirtualHost *:80>
    ServerAdmin webmaster@WPQA
    ServerName demo.example.com
    ServerAlias demo.example.com

    DocumentRoot /var/www/demo

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

*请注意该行通配符的使用<VirtualHost *:80>。我还设置了ServerAlias以及ServerName

相关内容