В моем по умолчанию-ssl
<VirtualHost _default_:443>
ServerName example.co
DocumentRoot /var/www/html/example
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName example2.co
DocumentRoot /var/www/html/example2
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerAlias subdomain1.*
DocumentRoot /var/www/html/example/subdomain1
</VirtualHost>
<VirtualHost *:443>
ServerAlias subdomain2.*
DocumentRoot /var/www/html/example/subdomain2
</VirtualHost>
Я хотел бы применить сертификат SSL к домену, но применить корень документа к разным поддоменам.
По какой-то причине
https://subdomain1.example.co/test is SECURE
https://subdomain1.example2.co/test is NOT SECURE
У меня есть подстановочный SSL-сертификат для обоих.
Оба должны работать.
Почему я могу без проблем назначить SSL для всех example.co и его поддоменов? Но я не могу сделать то же самое с example2.co?
Я стараюсь избегать написания большого количества кода, потому что все довольно логично. Есть более короткий способ сделать это (мое единственное решение):
<VirtualHost *:443>
ServerName example.co
DocumentRoot /var/www/html/example
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName example2.co
DocumentRoot /var/www/html/example2
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName subdomain1.example.co
DocumentRoot /var/www/html/example/subdomain1
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName subdomain1.example2.co
DocumentRoot /var/www/html/example2/subdomain1
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName subdomain2.example.co
DocumentRoot /var/www/html/example/subdomain2
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName subdomain2.example2.co
DocumentRoot /var/www/html/example2/subdomain2
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
Это должно работать с VirtualDocumentRoot:
<VirtualHost *:443>
ServerName example.co
DocumentRoot /var/www/html/example
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerName example2.co
DocumentRoot /var/www/html/example2
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerAlias *.example.co
VirtualDocumentRoot /var/www/html/example/%-3
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.co/chain.pem
</VirtualHost>
<VirtualHost *:443>
ServerAlias *.example2.co
VirtualDocumentRoot /var/www/html/example2/%-3
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example2.co/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example2.co/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example2.co/chain.pem
</VirtualHost>
В этой конфигурации для каждого поддомена корень документа устанавливается динамически. В %-3
берет третью часть (считая справа) запрошенного домена и добавляет ее к пути. Например sub1.example.co
приведет к /var/www/html/example/sub1
и abcd.example2.co
приведет к /var/www/html/example/abcd
. Если вы добавите субдомен, например sub123.example.co
вам даже не нужно трогать этот конфиг, потому что путь для этого поддомена устанавливается динамически :)
Дополнительная информация: есть тонкие различия между ServerName
и ServerAlias
:
ServerName
также может принимать номера портов, а ServerAlias - нет.
ServerAlias
может принимать подстановочные знаки (например, * .mywebsite.com), а ServerName - нет.
Вот почему вы должны использовать ServerAlias вместо ServerName для поддоменов с подстановочными знаками. Я не знаю, работает ли ServerAlias без ServerName. Если не просто добавить строку ServerName со случайным именем поддомена, например. any.example.co
к двум поддоменам с подстановочными знаками vhosts;)
Ссылка на пост, где я получил начальную информацию об этом: https://stackoverflow.com/questions/13566226/creating-wildcard-sub-domain-using-apache-virtualhost
Ссылка на документы apache2 об этом: https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html