2009-03-24 3 views
52

У меня есть длинный и запутанный список <VirtualHost> директивы, и я должен их дублировать на отдельные <VirtualHost> группы для портов 80 и 443, потому что я использую SSL. Всякий раз, когда я обновляю свои правила mod_rewrite, я должен помнить, чтобы делать это в обоих местах, иначе я сломаю свое приложение ... это дублирование требует неприятностей. Есть ли способ комбинировать или псевдонимы между ними - единственная разница между ними заключается в том, что версия порта 443 содержит SSLEngine, SSLCertificateFile и тому подобное.Должен ли я дублировать директивы Virtualhost для портов 80 и 443?

< Мои Virtualhost > содержит много правил mod_rewrite, правила LocationMatch, директивы CGI и т.п.

Кроме того, я не могу использовать .htaccess файлы.

+1

дубликата http://serverfault.com/questions/83669/apache2-with-ssl-do-i-have-to-copy-virtualhost-blocks –

ответ

43

Нельзя использовать директиву include, чтобы включить общие правила. here

article

например .:

<VirtualHost _default_:80> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:*> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:443> 
    ... #SSL rules 
    include conf/common_rule.conf 
</VirtualHost> 
+0

спасибо за это; btw, [здесь обновленная версия] (http://httpd.apache.org/docs/2.4/mod/core.html#include) директивы apache 'include', которая является первым связанным с ресурсом в вашем ответе –

+0

спасибо, я обновил его сейчас. – sfossen

2

Вы могли бы поставить общую конфигурацию в отдельный файл и включить его в обоих сегментах VirtualHost. Например:

<VirtualHost 192.168.1.2:80> 
    Include conf/common.conf 
</VirtualHost> 

<VirtualHost 192.168.1.2:443> 
    Include conf/common.conf 
    (put your ssl specific cofiguration stuff here ...) 
</VirtualHost> 
0

Вы также можете указать общие директивы внутри контейнера, а не внутри себя. Это то, что я делаю, в основном потому, что предпочитаю правила mod_rewrite на уровне каталогов, а не на уровне сервера, но он должен работать одинаково хорошо для вас.

+3

Вам не хватает критически важного слова. Можете ли вы добавить это? И если бы вы могли привести пример, который также был бы полезен. – iconoclast

32

Вы можете использовать любое количество хостов и портов в одной директиве Virtualhost.

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 

В моем случае я использовал.

<VirtualHost *:80 *:443> 
    ServerName loop.lk 

.... 
SSLEngine on 
SSLCertificateFile /etc/apache2/ssl/local.crt 

</VirtualHost> 
+8

SSLEngine on, как представляется, применяется, даже если сайт доступен через http, что приводит к ошибке страницы. –

+2

Если у вас есть блок '', я предполагаю, что у вас может быть отдельный блок для '', который включает только материалы SSL. Это верно? – iconoclast

+3

@iconoclast Нет, у вас не может быть другой директивы . Вы можете использовать <Если "% {SERVER_PROTOCOL}! = 'HTTPS'"> \t .... OR <Если "% {SERVER_PORT}! = '443'"> \t ... –

7

Извините, ударяться старый пост, как это, но для того, чтобы помочь другим сотрудникам Google, там я хотел бы поделиться, как я съезжались с ним:

У меня есть пара ВХосты на моем локальном хосте, скажем: localhost, foo.com, bar.com

Это локальный сайт на моем ноутбуке (macosx). Я мог бы уйти с самозаверяющими сертификатами, и поэтому ssl-часть будет одинаковой для всех vhosts. ..

Что я наделал:

Я создал каталог /etc/apache2/extra/vhosts/.

Я создал /etc/apache2/extra/vhosts/localhost.conf:

ServerName localhost 
DocumentRoot "/www/localhost" 
<Directory /www/localhost> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/localhost.error_log" 
CustomLog "/var/log/apache2/localhost.access_log" common 

/etc/apache2/extra/vhosts/foo.conf:

ServerName foo.com 
DocumentRoot "/www/foo.com" 
<Directory /www/foo.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/foo.com.error_log" 
CustomLog "/var/log/apache2/foo.com.access_log" common 

/etc/apache2/extra/vhosts/bar.conf:

ServerName bar.com 
DocumentRoot "/www/bar.com" 
<Directory /www/bar.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/bar.com.error_log" 
CustomLog "/var/log/apache2/bar.com.access_log" common 

И, наконец, /etc/apache2/extra/vhosts/ssl.conf:

SSLEngine on 
SSLCertificateFile "/etc/apache2/ssl/server.crt" 
SSLCertificateKeyFile "/etc/apache2/ssl/server.key" 

И в моем /etc/apache2/extra/httpd-vhosts.conf:

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/foo.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/foo.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/bar.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/bar.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 
+0

Также пошел с этим решением. Прекрасно работает –

 Смежные вопросы

  • Нет связанных вопросов^_^