Используя SNI, существует несколько доменов со своими собственными сертификатами SSL (LetsEncrypt) на одном IP-адресе. Для одного из основных доменов давайте просто скажем https: //thedomain.tld, посещение https: //www.thedomain.tld приводит к ошибке браузера (неправильное соответствие сертификата SSL) вместо того, чтобы либо обслуживать контент для www.thedomain.tld, либо перенаправлять. Я пробовал это разными способами. Пример:
<IfModule mod_ssl.c>
<VirtualHost 0.0.0.1:443>
ServerName domain.tld
ServerAlias www.domain.tld
DocumentRoot /var/www/domain.tld/
...
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
...
<Directory /var/www/domain.tld>
Options -ExecCGI -Indexes -Includes +FollowSymLinks
AllowOverride FileInfo AuthConfig
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R=301,L]
...
Версия: Apache 2.4.18
Боковое примечание: один сервер, это отлично работает (выделенный Ubuntu 16.04). С другой стороны (Amazon Ubuntu 16.04) его способность перенаправлять или ссылаться или что-то еще с www и без него не существует.
Я смог решить эту проблему, взломав перенаправление, используя два сертификата SSL. Это не мой предпочтительный метод, но сейчас он работает.
www. является авторитетным для этого сайта, поэтому вот что я сделал:
domain.tld
бланкетное перенаправление https: //domain.tld к https: //www.domain.tld
<VirtualHost *:443>
ServerName domain.tld
DocumentRoot /var/www/domain.tld
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
...
RedirectMatch 301 (.*) https://www.domain.tld$1
</VirtualHost>
<VirtualHost *:443>
ServerName www.domain.tld
...
Перво-наперво, если вы обслуживаете http: //www.thedomain.tld вообще, я бы подумал о перенаправлении его на https: //thedomain.tld. Это решает проблему для пользователей, вводящих www.thedomain.tld в своем браузере (но не решает ее для пользователей, которые вводят https: или уже имеют ссылки / закладки https или вынуждены переходить на https браузерами / HSTS).
Если вы не обслуживаете простой http, то, к сожалению, вам либо нужен сертификат, содержащий либо www.thedomain.tld, либо * .thedomain.tld в поле сертификата SAN (или поле CN, если SAN отсутствует).
Невозможно обойти это с помощью всего, что производит Apache. Первое, что получает браузер после TCP-соединения, - это сертификат. Если SAN / CN не соответствует точно тому имени хоста, которое хочет браузер, игра окончена. Браузер отображает предупреждение и даже не отправляет HTTP-запрос, поэтому Apache никогда не отвечает.
Редирект все равно не бывает.
Если вы получаете сертификат www.thedomain.tld отдельно от сертификата domain.tld, вам необходимо поместить отдельное имя сервера в отдельный виртуальный хост Apache. Но это создает проблемы с обслуживанием.
Я бы рекомендовал один сертификат (поле SAN может содержать много имен), и тогда конфигурация ServerName + ServerAlias будет работать так, как вы указали.