Нужно ли дублировать директивы Virtualhost для портов 80 и 443? - PullRequest
57 голосов
/ 25 марта 2009

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

My содержит множество правил mod_rewrite, правил LocationMatch, директив CGI и т. Д.

Также я не могу использовать файлы .htaccess.

Ответы [ 6 ]

47 голосов
/ 25 марта 2009

Не можете ли вы использовать директиву включения для включения общих правил. здесь

товар

например:.

<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>  
34 голосов
/ 13 июня 2013

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

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

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

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

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

</VirtualHost>
8 голосов
/ 05 ноября 2015

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

У меня есть несколько vhosts на моем локальном хосте, скажите: 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>
2 голосов
/ 17 сентября 2018

Другая опция вместо Include использует Macro (так что вы можете хранить все это в одном файле).

Сначала включите макромодуль:

a2enmod macro

Затем поместите ваши общие материалы в макрос и use из ваших виртуальных хостов:

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin example@example.com
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

<VirtualHost *:80>
  Use SharedStuff
</VirtualHost>

<VirtualHost *:443>
  Use SharedStuff

  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ...
</VirtualHost>

Макросы также могут принимать параметры и быть определены в других включенных файлах; так что вы можете использовать их немного как функции и сохранить много дубликатов в ваших конфигурационных файлах Apache.

Подробнее смотрите здесь:

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

2 голосов
/ 25 марта 2009

Вы можете поместить общую конфигурацию в отдельный файл и включить ее в оба сегмента 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 голосов
/ 25 марта 2009

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

...