子域无法在 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 个:
- DNS A 条目需要一些时间才能完成
- 我的 .htaccess 转发导致 URL 总是被重写为 www.example.com,无论输入哪个子域名
- 我的
test.example.com.conf
文件中有一个错误,这使得子域只能通过 https 访问:<VirtualHost _default_:80>
中缺少 ServerAlias 指令
所以它到目前为止工作正常,需要一些改进...
我希望我能帮助别人解决我的错误!
我想在我的 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 个:
- DNS A 条目需要一些时间才能完成
- 我的 .htaccess 转发导致 URL 总是被重写为 www.example.com,无论输入哪个子域名
- 我的
test.example.com.conf
文件中有一个错误,这使得子域只能通过 https 访问:<VirtualHost _default_:80>
中缺少 ServerAlias 指令
所以它到目前为止工作正常,需要一些改进...
我希望我能帮助别人解决我的错误!