Czy Apache2 z SSL muszę kopiować bloki VirtualHost?

18

W Apache2 na Ubuntu mam witrynę słuchającą na 80, a teraz chcę dodać SSL. Czy istnieje sposób, aby włączyć SSLEngine dla portu 443, więc nie muszę kopiować całego bloku VirtualHost?

Kiedy to zrobię:

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
  SSLEngine On
  ... a bunch more lines...
</VirtualHost>

Włącza SSLEngine dla portu 80. Czy istnieje sposób, aby użyć tylko jednego bloku VirtualHost i tylko włączyć SSLEngine dla portu 443? Więc mogę zrobić coś takiego?

Listen 80
Listen 443
NameVirtualHost *
<VirtualHost *>
   <IfPort 443>
      SSLEngine On
   </IfPort>
   ... a bunch of lines I don't want to copy into another VirutalHost block...
</VirtualHost>
dar
źródło

Odpowiedzi:

14

Nie można zmusić jednego hosta do obsługi zarówno HTTP, jak i HTTPS, ponieważ są one oddzielnymi hostami obsługującymi osobne protokoły. Zamiast tego powinieneś umieścić całą wspólną konfigurację w osobnym pliku, a następnie dołączyć ten plik zarówno do vhostów SSL, jak i innych niż SSL dla domeny.

Minimalny przykład:

# /etc/apache2/sites-available/example.com
<VirtualHost *:80>
  Include /etc/apache2/domains/example.com
</VirtualHost>

<VirtualHost 192.0.2.1:443>
  SSLEngine On
  SSLCertificateFile /etc/ssl/example.com_crt
  SSLCertificateKeyFile /etc/ssh/example.com_key

  Include /etc/apache2/domains/example.com
</VirtualHost>

# /etc/apache2/domains/example.com
ServerName example.com
ServerAlias www.example.com

ServerAdmin [email protected]
DocumentRoot /home/example/public_html
ErrorLog /home/example/apache/error.log
womble
źródło
Czy możesz podać mi krótki przykład tego, jak powinien wyglądać plik? Czy potrzebuje opakowania VirtualHost, czy powinienem po prostu przenieść do niego wszystkie linie bez opakowania?
dar
1
Dodałem przykład do mojej odpowiedzi.
womble
1

Jak wspomniałem w innym pytaniu dotyczącym stackoverflow ( /programming/679383/do-i-have-to-duplicate-the-virtualhost-directives-for-port-80-and-443/52375167# 52375167 ):

Inną opcją zamiast użycia Includejest używanie Macro(abyś mógł zachować wszystko w jednym pliku).

Najpierw włącz moduł makr:

a2enmod macro

Następnie umieść swoje udostępnione rzeczy w makrze i usena wirtualnych hostach:

<Macro SharedStuff>
   ServerName example.com
   ServerAdmin [email protected]
   <DocumentRoot /var/www/example>
      ...
   </DocumentRoot>
</Macro>

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

<VirtualHost *:443>
  Use SharedStuff

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

Makra mogą również przyjmować parametry i być definiowane w innych dołączonych plikach; dzięki czemu możesz używać ich trochę jak funkcji i zaoszczędzić dużo duplikacji w plikach konfiguracyjnych Apache.

Zobacz tutaj po więcej szczegółów:

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

Seb
źródło
0

Możesz umieścić ustawienia katalogu w <Directory>bloku poza dowolnymi <VirtualHost>blokami. To zastosuje je na wszystkich wirtualnych hostach, ale tylko w określonej ścieżce.

DanMan
źródło