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?

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.


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.


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


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?”


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.