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

13

У меня есть довольно большое определение VirtualHost, которое я не хочу дублировать, чтобы сайт также работал по HTTPS.

Вот что я хочу сделать:

<VirtualHost *>
    ServerName example.com

    <If port=443>
        SSLEngine on
        SSLCertificateFile ...
        SSLCertificateKeyFile ...
        SSLCertificateChainFile ...
    </If>

    (other config)

</VirtualHost>

Есть ли способ сделать это?
Я пропускаю какой-то другой способ не дублировать конфигурацию?

Джейк
источник

Ответы:

12

Текущая стабильная версия Apache (2.2) не имеет этой функции, но 2.4 имеет директиву IF .

Вы должны создать два VirtualHosts на данный момент, но вы можете установить некоторые вещи через глобальные переменные окружения или apache и использовать их в вашей конфигурации virtualhost (например, при настройке documentroot). Таким образом, если вы хотите изменить это, вы можете сделать это только одной строкой изменения.

Конечно, вы можете использовать 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. Все основные браузеры уже поддерживают его, если вы работаете в поддерживаемой ОС.

редактировать: из-за частоты вы не можете поместить SSLEngine в блок If, поэтому мой ответ неверный.

Tyrael
источник
8
Попытка поставить SSLEngine Onв <If>даст SSLEngine not allowed here, поэтому предлагаемый вариант использования в начале этого ответа , к сожалению , не представляется возможным. Похоже, это связано с тем, что в этом разделе конфигурации может использоваться только «директивы, поддерживающие контекст каталога». (ref) и SSLEngineесть server config, virtual host (ref) , а не каталог.
fooquency
3

Нет. Вы можете переместить большинство вещей в глобальный конфиг и наследовать его в VirtualHost.

Крис С
источник
1
К сожалению, у меня есть несколько виртуальных хостов, каждый из которых имеет различные конфигурации и большинство из которых должны работать через HTTP и HTTPS.
Джейк
1
Как бы ни был бесполезен этот ответ, он единственный правильный. Пожалуйста, перейдите на веб-сервер, который не сосет. :)
интр
3

На это был дан ответ в другом вопросе. Используйте оператор «Включить». Работал как шарм для меня:

Служите 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>
Кевин Паркер
источник
2

Для виртуальных хостов SSL вы должны использовать второй порт

<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?»

Пол С
источник
2
Но помните об этом на будущее: en.wikipedia.org/wiki/Server_Name_Indication
mattdm
По иронии судьбы, к тому моменту, когда SNI станет достаточно широко распространенным, чтобы его можно было безопасно использовать для большинства сайтов виртуального хостинга, IPv6, вероятно, станет достаточно распространенным, чтобы сделать его неактуальным.
jgoldschrafe
4
@jgoldschrafe Привет 2010, это будущее говорить здесь! Недавние исследования показывают, что браузеры без SNI составляют <2% по всему миру. С первого мира, вероятно, намного меньше. IPv4 еще жив и здоров :)
kubanczyk
2
@kubanczyk Понял меня! :)
jgoldschrafe
@jgoldschrafe Даже с IPv6 я бы по-прежнему не использовал SNI, а назначал блоки адресов одной машине, поскольку IP-адреса в основном предназначены для маршрутизации, и таким способом легче управлять.
Бахсау