Назад | Перейти на главную страницу

Могу ли я определить HTTP и HTTPS в одном VirtualHost в Apache conf?

У меня довольно большое определение 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?"