Czy mogę zdefiniować HTTP i HTTPS w tym samym VirtualHost w Apache conf?

13

Mam dość dużą definicję VirtualHost, której nie chcę powielać, aby strona działała również przez HTTPS.

Oto, co chcę zrobić:

<VirtualHost *>
    ServerName example.com

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

    (other config)

</VirtualHost>

Czy jest jakiś sposób, aby to zrobić?
Czy brakuje mi innej metody nie powielania konfiguracji?

Jake
źródło

Odpowiedzi:

12

Obecna stabilna wersja Apache (2.2) nie ma tej funkcji, ale 2.4 ma dyrektywę IF .

Na razie musisz utworzyć dwa VirtualHosty, ale możesz ustawić pewne rzeczy za pomocą zmiennych globalnych środowiska lub apache i użyć ich w konfiguracji virtualhost (na przykład ustawiając katalog główny). W ten sposób, jeśli chcesz zmienić, możesz to zrobić za pomocą tylko jednej linii modyfikacji.

Oczywiście możesz użyć polecenia include, aby zrobić coś takiego:

<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 będzie głównym nurtem lat przed adaptacją IPv6. Wszystkie główne przeglądarki obsługują już to, zakładając, że korzystasz z obsługiwanego systemu operacyjnego.

edit: jak zauważono fooquency, nie można ustawić SSLEngine w bloku If, więc moja odpowiedź jest błędna.

Tyrael
źródło
8
Próbuje umieścić SSLEngine Onw sposób <If>da SSLEngine not allowed here, więc zasugerował use-case na początku tej odpowiedzi niestety nie wydaje się być możliwe. Wydaje się, że dzieje się tak, ponieważ w tej sekcji konfiguracji można stosować tylko „dyrektywy obsługujące kontekst katalogu”. (ref) i SSLEnginejest server config, virtual host (ref) , a nie katalogiem.
fooquency
3

Nie. Możesz przenieść większość rzeczy do globalnej konfiguracji i odziedziczyć ją w VirtualHost.

Chris S.
źródło
1
Niestety mam kilka VirtualHostów, każda z inną konfiguracją i większość z nich wymaga pracy przez HTTP i HTTPS.
Jake,
1
Choć ta odpowiedź jest nieprzydatna, jest to jedyna poprawna odpowiedź. Przejdź na serwer sieciowy, który nie jest do bani. :)
intgr
3

Odpowiedzi na to udzieliło inne pytanie. Użyj instrukcji Dołącz. Działa dla mnie jak urok:

Podaj http (port 80) i https (port 443) na tym samym 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>
Kevin Parker
źródło
2

W przypadku wirtualnych hostów SSL musisz albo użyć drugiego portu ala

<VirtualHost *:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
    Servername def.com
</VirtualHost>

lub musisz użyć oddzielnych adresów IP

<VirtualHost 192.168.0.1:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
    Servername def.com
</VirtualHost>

W dokumentacji Apache SSL znajduje się naprawdę dobre wytłumaczenie http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

Wyszukaj „Dlaczego nie mogę używać protokołu SSL w przypadku hostów wirtualnych opartych na nazwie / bez adresu IP?”

Paul S.
źródło
2
Pamiętaj o tym na przyszłość: en.wikipedia.org/wiki/Server_Name_Indication
mattdm
Jak na ironię, do czasu, gdy SNI jest powszechnie akceptowany na tyle, aby można go było bezpiecznie stosować w większości wirtualnych witryn hostingowych, IPv6 prawdopodobnie będzie na tyle powszechny, że nie będzie miał znaczenia.
jgoldschrafe
4
@jgoldschrafe Cześć 2010, mówi się tutaj o przyszłości! Ostatnie kajaki pokazują, że przeglądarki inne niż SNI to <2% na całym świecie. Z pierwszego świata jest to prawdopodobnie znacznie mniej. IPv4 wciąż żyje i ma się dobrze :)
kubańczyk
2
@kubanczyk Got me! :)
jgoldschrafe
@ jgoldschrafe Nawet w przypadku IPv6 nadal wolałbym SNI przed przypisywaniem bloków adresów do jednego komputera, ponieważ adresy IP służą głównie do routingu i łatwiej jest nimi zarządzać.
Bachsau,