
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_macro
lö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- If
Struktur an und manipulieren Sie die Anfrage. Siehedie Kerndokumentation für If
sUnddie 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 VirtualHost
Tags 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 NameVirtualHost
davon Listen
in Ihrer apache2.conf
Datei 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.