Frage Serve http (Port 80) und https (Port 443) auf demselben VirtualHost


Ich muss meinen VirtualHost auf Apache einrichten, um sowohl auf http als auch auf https (unter Verwendung von Standardports) zu dienen.

Wenn ich die SSL-Engine aktiviere (wie unten) - bekomme ich einen Fehler, wenn ich auf Port 80 bin.

Der Grund ist, dass Teile der Site SSL sein müssen, andere nicht. Wie kann ich sowohl http + https auf der Website bedienen?

Hier ist meine virtuelle Host-Datei ....

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>

22
2017-08-22 11:31


Ursprung




Antworten:


Sie können dies nicht in einem virtuellen Host tun, da Apache wissen muss, welcher SSL sprechen wird und welcher nicht (sidenote: nginx hat dieses Problem nicht, Sie können ihm sagen, welche listen-Direktiven sich auf SSL beziehen; einer der vielen Gründe, warum ich es liebe).

Die Art und Weise, wie ich dies in Apache bearbeite, besteht darin, alle meine nicht-SSL-bezogenen Konfigurationen in eine separate Datei zu legen und die beiden vhosts nebeneinander so zu konfigurieren, dass sie jeweils die sitespezifische Konfigurationsdatei in der vhost-Zeilengruppe enthalten :

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

38
2017-08-22 11:38





Es scheint ein Problem in Apache vHost zu sein, aber es funktioniert, ohne die Konfiguration wiederholen zu müssen.

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>

5
2017-11-05 20:08



Das ist wirklich komisch, aber existiert! - user77376
Das hat so gut funktioniert, wie man es von einem solchen Kludon erwarten kann - fast, aber nicht ganz! Ich habe festgestellt, dass Apache 2.4.10 die Umgebungsvariable SERVER_PORT auf 443 setzt, anstatt den Port zu verwenden, an dem die Anfrage einging (80 oder 443 abhängig). <IMAGINARY_PARAGRAPH_BREAK> Schade, denn ich hatte gehofft, dass ich das verwenden könnte, da ich wirklich eine Datei pro virtuellem Host behalten wollte. <IMAGINARY_PARAGRAPH_BREAK> Außerdem benötigen Sie eine ServerName-Anweisung innerhalb des obersten <VirtualHost>, andernfalls werden die Anforderungen irrtümlich verschlungen. Setze es auf ServerName badhost.bad oder so. - Daniel Beardsmore
@DanielBeardsmore: Ich habe das gerade mit 2.4.18 aus RH Software Sammlungen getestet, und das scheint wegen der Standard von zu sein UseCanonicalPhysicalPort Off. Wenn Sie diese Option aktivieren, scheint der tatsächliche Port verwendet zu werden. (Lustigerweise musste ich das verlassen SSLEngine On in meinem doppelt verwendeten vhost und bekam Port 80 als Standard.) - Ulrich Schwarz
@DanielBaardsmore: FWIW, %{HTTPS} wird auch korrekt eingestellt, aber %{REQUEST_SCHEME} ist nicht (immer http). Ich würde mich dumm fühlen, eine Feature-Anfrage für eine UseCanonicalRequestScheme Richtlinie, obwohl. - Ulrich Schwarz