Используя 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
blanket redirect https: //domain.tld на https: //www.domain.tld
ServerName domain.tld
DocumentRoot /var/www/domain.tld
SSLEngine включен
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
...
RedirectMatch 301 (. *) Https: //www.domain.tld$1
Имя сервера 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 отдельно от thedomain.tld сертификат, вам нужно поместить отдельное имя сервера в отдельный виртуальный хост Apache. Но это создает проблемы с обслуживанием.
Я бы рекомендовал один сертификат (поле SAN может содержать много имен), и тогда конфигурация ServerName + ServerAlias будет работать, как вы указали.