2009-03-24 13 views
52

Mam długą i skomplikowaną listę dyrektyw <VirtualHost> i muszę je skopiować do oddzielnych grup <VirtualHost> dla portów 80 i 443, ponieważ używam SSL. Ilekroć aktualizuję reguły mod_rewrite, muszę pamiętać o tym, aby zrobić to w obu miejscach, bo inaczej przerywam swoją aplikację ... to duplikowanie wymaga kłopotów. Czy istnieje sposób na połączenie lub alias - jedyna różnica między nimi polega na tym, że wersja 443 portu zawiera SSLEngine, SSLCertificateFile i podobne.Czy muszę duplikować dyrektywy Virtualhost dla portów 80 i 443?

My <virtualhost> zawiera wiele zasad, reguł mod_rewrite dyrektyw LocationMatch, CGI itp

Ponadto, nie można używać plików .htaccess.

+1

duplikatem http://serverfault.com/questions/83669/apache2-with-ssl-do-i-have-to-copy-virtualhost-blocks –

Odpowiedz

43

Nie możesz użyć dyrektywy włączania, aby uwzględnić wspólne reguły. here

article

np .:

<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

dzięki za to; btw, [tutaj jest zaktualizowana wersja] (http://httpd.apache.org/docs/2.4/mod/core.html#include) dyrektywy 'include' apache, która jest pierwszym połączonym zasobem w twojej odpowiedzi –

+0

dzięki, zaktualizowałem to teraz. – sfossen

2

Można umieścić wspólną konfigurację w osobnym pliku i umieścić go w obu segmentach virtualhost. Na przykład:

<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

Można również określić wspólne dyrektywy w kontenerze zamiast w nim samym. Tak właśnie robię, głównie dlatego, że preferuję reguły mod_rewrite na poziomie katalogu, a nie na poziomie serwera, ale powinno to działać równie dobrze dla ciebie.

+3

Brakuje ci krytycznie ważnego słowa. Czy możesz to dodać? A jeśli mógłbyś podać przykład, który również byłby pomocny. – iconoclast

32

Możesz używać dowolnych # hostów i portów w jednej dyrektywie Virtualhost.

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

W moim przypadku użyłem.

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

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

</VirtualHost> 
+8

SSLEngine on wydaje się być stosowane, nawet jeśli witryna jest dostępna za pośrednictwem http, w wyniku czego strona błędu. –

+2

Jeśli masz blok '', zakładam, że możesz mieć oddzielny blok dla '', który obejmuje tylko elementy SSL. Czy to jest poprawne? – iconoclast

+3

@iconoclast Nie, nie możesz mieć kolejnej dyrektywy . Można użyć \t .... lub \t ... –

7

Niestety zderzyć się starego posta podobnego, lecz aby pomóc innym Googlersom tam chciałem podzielić jak ja dealed z nim:

Mam parę vhostów na moim localhost, powiedz: localhost, foo.com, bar.com

Będąc witryną localhost na moim laptopie (macosx) mogłem uciec z samopodpisanymi certyfikatami, a tym samym część ssl jest taka sama dla wszystkich vhostów. ..

Co zrobiłem to:

Utworzono katalog /etc/apache2/extra/vhosts/.

stworzyłem /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 

I wreszcie /etc/apache2/extra/vhosts/ssl.conf:

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

I w moim /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

Udało się również z tym rozwiązaniem. Działa świetnie –