子域无法在 Apache2/Debian9 上运行

Subdomain not working on Apache2/Debian9

我想在我的 Debian 9 和 Apache 2 虚拟服务器上设置一个子域,它指向 /var/www/html/test 的目录。 SSL 和 Let's Encrypt 也已启用,因此也应使用 https 访问子域。

我的 000-default.conf 文件如下所示:

<VirtualHost _default_:80>

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html


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

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
<VirtualHost _default_:443>
        DocumentRoot /var/www/html
        ServerName www.example.com
        <IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
        </IfModule>
        SSLEngine on
        ServerAlias www.example.com
        SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

文件 default-ssl.conf 看起来像:

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

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

                SSLEngine on

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

                ServerName www.example.com
                ServerAlias example.com
        </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我复制了一份 000-default.conf 文件,将其命名为 "test.example.com.conf" 并通过 a2ensite 启用它。该文件如下所示:

<VirtualHost _default_:80>

        ServerAdmin webmaster@test.example.com
        DocumentRoot /var/www/html/test

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

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

<VirtualHost _default_:443>
        DocumentRoot /var/www/html/test
        ServerName test.example.com
        <IfModule mod_headers.c>
                Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
        </IfModule>
        SSLEngine on
        ServerAlias test.example.com
        SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

我的 hosts 文件包含条目 SERVER_IP_ADDRESS test.example.com.

DNS 服务器有一个 "A"-条目 test.example.com 指向 SERVER_IP_ADDRESS

从另一台机器 Ping test.example.com 以 "Host not found" 结束,对虚拟服务器的 Ping 会导致其自身的响应。

为什么浏览器只显示"Server not found"? 我忘了什么吗?我的配置有问题吗?

经过长时间的测试和研究,我发现了错误! 有 3 个:

  1. DNS A 条目需要一些时间才能完成
  2. 我的 .htaccess 转发导致 URL 总是被重写为 www.example.com,无论输入哪个子域名
  3. 我的 test.example.com.conf 文件中有一个错误,这使得子域只能通过 https 访问:<VirtualHost _default_:80>
  4. 中缺少 ServerAlias 指令

所以它到目前为止工作正常,需要一些改进...

我希望我能帮助别人解决我的错误!