Apache2 VirtualHost IfPort?

Apache2 VirtualHost IfPort?

Ich möchte einen virtuellen Host wie diesen erstellen:

<VirtualHost *:80 *:443>
    <IfPort 443>
        SSLEngine On
        ...
    </IfPort>

    ...
</VirtualHost>

Wenn also über Port 443 auf den Host zugegriffen wurde, möchte ich einige zusätzliche Funktionen hinzufügen. Kann ich das irgendwie erreichen oder muss ich das auf zwei virtuelle Hosts aufteilen?

Antwort1

Ich mod_macrolöse dieses Problem auf einem Server, auf dem zahlreiche verschiedene Domänen gehostet werden ... Installieren Sie das Modul (unterschiedlich je nach Betriebssystem/Distribution) und konfigurieren Sie es dann etwa so:

LoadModule macro_module         libexec/apache22/mod_macro.so

<Macro VHost $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

<Macro VHostSSL $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost>
        <VirtualHost *:443>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                SSLEngine on
                SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
                SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

Use VHostSSL example.com 
Use VHost    example.net

Das Hinzufügen einer neuen Domäne ist ganz einfach. Alle domänenspezifischen Konfigurationen werden in die Include-Datei eingefügt.

Antwort2

mit Johns Lösung bekomme ich dies

Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here

wie John sagte, ist es am besten, zwei virtuelle Hosts zu haben. Aber mein virtueller Host-Code hatte mehr als 150 Zeilen (viele Reverse-Proxys), da ich nicht zwei Exemplare von jedem Code haben wollte (und eine sehr lange Konfigurationsdatei). Deshalb habe ich am Ende Folgendes gemacht, und es funktioniert:

1. Erstellen Sie einen virtuellen Host für einen Nicht-SSL-virtuellen Host.

2.Erstellen Sie einen weiteren virtuellen Host und einen Reverse-Proxy zum ersten virtuellen Host

<VirtualHost *:443>
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "...cert.crt"
    SSLCertificateKeyFile "...server.ssl.key"
    ... (any ssl specific config)

    ProxyPreserveHost On
    ProxyPass / http://localhost:80/
    ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>

Dies ist weder eine gute noch leistungsfreundliche Lösung, aber wenn der Grund dafür, dass Sie keine zwei virtuellen Hosts möchten, darin liegt, zu verhindern, dass Sie zwei Versionen aller virtuellen Hostkonfigurationen haben (was bedeutet, dass Sie jedes Mal, wenn Sie etwas ändern möchten, zwei Zeilen ändern müssen), funktioniert dies.

Antwort3

Eine weitere Möglichkeit, Duplikate zu vermeiden, besteht darin, die Virtualhost-Konfiguration in einer bestimmten Datei zu speichern und sie mit einem Include einzubinden:

/etc/path/to/config/example.com.conf:

ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts

Und Ihre virtuelle Hosts-Datei:

<VirtualHost *:443>
    SSLEngine on
    # Other SSL directives
    Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
    Include /etc/path/to/config/example.com.conf
</VirtualHost>

Antwort4

Schauen Sie sich die Apache- IfStruktur an und manipulieren Sie die Anfrage. Siehedie Kerndokumentation für IfsUnddie Liste der verfügbaren Ausdrücke, die darin verwendet werden könnenSie könnten beispielsweise Folgendes tun:

<If "%{SERVER_PORT} == '443'">
    # Do stuff
</If>

Bezüglich Ihres VirtualHostTags sehe ich keine solche Lösung in der Apache2-Dokumentation. Siehehttp://httpd.apache.org/docs/2.2/en/vhosts/examples.html#portund versuchen Sie Ihre Option: Apache2 verwendet eine ähnliche für verschiedene IPs anstelle verschiedener Ports (http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#intraextra).

Ich würde trotzdem die Verwendung von zwei unterschiedlichen virtuellen Hosts empfehlen, das ist viel übersichtlicher. Sie werden sowieso zwei NameVirtualHostdavon Listenin Ihrer apache2.confDatei benötigen.

Bearbeiten

Mir war nicht klar, dass diese Lösung tatsächlich einen Fehler verursachte, aber kommen wir zurück zum Konzept selbst... Das Abhören auf 80 oder 443 ist eigentlich kein Problem. Apache2 würde gerne eine elegante Lösung dafür bereitstellen, wenn es nicht die... Verschlüsselung gäbe. Apache2 wurde in C entwickelt und verwendet neben Threads und Forks auch Sockets. In C erfordert die Verwendung von SSL die Initialisierung von OpenSSL-Komponenten und einige Umgehungen des Basis-Sockets, um die ganze SSL-Sache zu implementieren. Sie suchen nach einer einfachen Lösung, aber der gesamte Mechanismus dahinter ist knifflig... Aus diesem Grund können Sie SSL nicht in einem einfachen virtuellen Host aktivieren: HTTP und HTTPs sind unterschiedliche Komponenten, und bei Apache2 gibt es leider kein Konzept der Vererbung zwischen ersterem und letzterem.

verwandte Informationen