Podaj http (port 80) i https (port 443) na tym samym VirtualHost


29

Muszę skonfigurować mój VirtualHost na Apache, aby obsługiwał zarówno HTTP, jak i https (używając standardowych portów)

Jeśli włączę silnik SSL (jak poniżej) - na porcie 80 pojawia się błąd.

Powodem jest to, że części witryny muszą być SSL, ale inne nie. Jak mogę zacząć wyświetlać zarówno http + https w witrynie?

Oto mój wirtualny plik hosta ....

NameVirtualHost *

<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName mysite.co.uk
        DocumentRoot /var/www/mysite/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysite/public>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

     #SSL STUFF...
      SSLEngine on
      SSLCertificateFile /etc/apache2/crts/mysite.crt
      SSLCertificateKeyFile /etc/apache2/crts/mysite.key
      SSLCertificateChainFile /etc/apache2/crts/DigiCertCA.crt


</VirtualHost>

Odpowiedzi:


44

Nie możesz tego zrobić na jednym wirtualnym hoście, ponieważ Apache musi wiedzieć, który ma mówić SSL, a który nie (sidenote: nginx nie ma tego problemu, możesz powiedzieć, które dyrektywy nasłuchiwania dotyczą SSL; jeden z wielu powodów, dla których to uwielbiam).

Sposób, w jaki zarządzam tym w Apache, polega na umieszczeniu całej mojej konfiguracji niezwiązanej z SSL w osobnym pliku, a następnie skonfigurowaniu dwóch hostów vhost obok siebie, w tym pliku konfiguracji specyficznej dla witryny w sekcji vhost, tak jak to :

<VirtualHost 192.0.2.12:80>
    Include /etc/apache2/sites/example.com
</VirtualHost>

<VirtualHost 192.0.2.12:443>
    SSLEngine On
    # etc
    Include /etc/apache2/sites/example.com
</VirtualHost>

7

Wydaje się, że jest to problem w Apache vHost, ale wykonuje to zadanie bez konieczności powtarzania konfiguracji.

SSLCertificateFile /srv/.ssl/self/server.crt
SSLCertificateKeyFile /srv/.ssl/self/server.pem

# REQUIRED
<VirtualHost *:80>
    DocumentRoot /srv/www/badhost
</VirtualHost>

<VirtualHost *:80 *:443>
    SSLEngine On
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /srv/www/example.www
</VirtualHost>

To naprawdę dziwne, ale istnieje!
user77376

1
Działa to tak dobrze, jak można się spodziewać po takiej kludge - prawie, ale nie całkiem! Odkryłem, że Apache 2.4.10 ustawia zmienną środowiskową SERVER_PORT na 443 zamiast używać portu, na który wpłynęło żądanie (w zależności od 80 lub 443). <IMAGINARY_PARAGRAPH_BREAK> Szkoda, bo miałem nadzieję, że będę mógł z tego skorzystać, ponieważ naprawdę chciałem zachować jeden plik na wirtualny host. <IMAGINARY_PARAGRAPH_BREAK> Będziesz także potrzebował dyrektywy ServerName w górnej części <VirtualHost>, w przeciwnym razie przypadkowo pochłonie żądania. Ustaw na ServerName badhost.bad lub coś.
Daniel Beardsmore

1
@DanielBeardsmore: Właśnie przetestowałem to z wersją 2.4.18 z kolekcji RH Software i wydaje się, że wynika to z domyślnej wartości UseCanonicalPhysicalPort Off. Jeśli włączysz tę opcję, prawdopodobnie użyjesz faktycznego portu. (Co zabawne, musiałem zrezygnować z SSLEngine Onmojego podwójnie używanego vhosta i jako domyślny dostałem port 80.)
Ulrich Schwarz

1
@DanielBeardsmore: FWIW, %{HTTPS}również zostanie ustawiony poprawnie, ale %{REQUEST_SCHEME}nie jest (zawsze http). Głupio byłoby jednak zgłosić prośbę o UseCanonicalRequestSchemedyrektywę.
Ulrich Schwarz
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.