Нужно ли дублировать директивы Virtualhost для портов 80 и 443?
У меня есть длинный и сложный список <VirtualHost> директивы, и я должен дублировать их в отдельный <VirtualHost> группы для портов 80 и 443, потому что я использую SSL. Всякий раз, когда я обновляю свои правила mod_rewrite, я должен помнить, чтобы делать это в обоих местах, иначе я сломаю свое приложение... это дублирование требует неприятностей. Есть ли способ объединить или перечислить их - единственная разница между ними состоит в том, что версия порта 443 содержит SSLEngine, SSLCertificateFile и т.п.
My <Virtualhost> содержит много правил mod_rewrite, правила LocationMatch, директивы CGI и т.д.
Кроме того, я не могу использовать файлы .htaccess.
Ответы
Ответ 1
Нельзя использовать директиву include для включения общих правил. здесь
статья
например:.
<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>
Ответ 2
Вы можете использовать любое количество хостов и портов в одной директиве Virtualhost.
<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
В моем случае я использовал.
<VirtualHost *:80 *:443>
ServerName loop.lk
....
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/local.crt
</VirtualHost>
Ответ 3
Извините, что столкнулся с таким старым сообщением, но для того, чтобы помочь другим гуглерам, я хотел поделиться тем, как я с ним справился:
У меня есть пара vhosts на моем localhost, скажем:
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
A /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
A /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>
Ответ 4
Вы можете поместить общую конфигурацию в отдельный файл и включить ее в оба сегмента 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>
Ответ 5
Вы также можете указать общие директивы внутри контейнера, а не внутри себя. Это то, что я делаю, в основном потому, что предпочитаю правила mod_rewrite на уровне каталога, а не на уровне сервера, но он также должен работать одинаково хорошо для вас.