У меня довольно большое определение VirtualHost, которое я не хочу дублировать, чтобы сайт также работал по HTTPS.
Вот что я хочу сделать:
<VirtualHost *>
ServerName example.com
<If port=443>
SSLEngine on
SSLCertificateFile ...
SSLCertificateKeyFile ...
SSLCertificateChainFile ...
</If>
(other config)
</VirtualHost>
Как это сделать?
Мне не хватает другого метода, чтобы не дублировать конфигурацию?
Текущая стабильная версия Apache (2.2) не имеет этой функции, но в 2.4 есть Директива IF.
На данный момент вам нужно создать два VirtualHosts, но вы можете установить некоторые вещи через глобальные переменные среды или apache и использовать их в своей конфигурации виртуального хоста (например, установив корневой каталог документов). Таким образом, если вы хотите изменить это, вы можете сделать это с помощью всего одной строки модификации.
Конечно, вы можете использовать include, чтобы сделать что-то вроде этого:
<VirtualHost *:80>
include /etc/apache2/vhost.conf.d/site1
</VirtualHost>
<VirtualHost *:443>
include /etc/apache2/vhost.conf.d/site1
include /etc/apache2/vhost.conf.d/site1-ssl
</VirtualHost>
ps: SNI будет мейнстримом лет до адаптации IPv6. Все основные браузеры уже поддерживают его при условии, что вы используете поддерживаемую ОС.
edit: как было замечено, вы не можете включить SSLEngine в блок If, поэтому мой ответ неверен.
На это был дан ответ в другом вопросе. Используйте оператор Include. Сработало для меня как шарм:
Обслуживать http (порт 80) и https (порт 443) на одном VirtualHost
# Acme Co
<VirtualHost 192.168.56.101:80>
Include /usr/local/apache2/conf/main-acme.conf
</VirtualHost>
###* SSL
<VirtualHost 192.168.56.101:443>
Include /usr/local/apache2/conf/main-acme.conf
SSLEngine On
</VirtualHost>
Нет. Вы можете переместить большинство вещей в глобальную конфигурацию и унаследовать ее от VirtualHost.
Для виртуальных хостов SSL вам нужно либо использовать второй порт ala
<VirtualHost *:443>
ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
Servername def.com
</VirtualHost>
или вам нужно использовать отдельные IP-адреса
<VirtualHost 192.168.0.1:443>
ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
Servername def.com
</VirtualHost>
На самом деле есть очень хорошее объяснение в документации Apache SSL http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html
Найдите "Почему я не могу использовать SSL с виртуальными хостами на основе имен / без IP?"