Apache
Virtual Hosts mit SSL
Echte IP-based Virtual Hosts
Die beliebten named-based Virtual Hosts lassen sich eigentlich mit SSL nicht verwenden (Begründung siehe hier). Man muss also pro Virtual Host eine separate IP-Adresse verwenden, z.B. durch Zuweisung einer Alias-IP-Adresse und (bei NAT) Umleitung eines zusätzlichen Ports vom Router.
Die Konfig sieht dann so aus:
<IfDefine SSL> <IfDefine !NOSSL> <Directory "/srv/www/vhosts/server1"> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory> <Directory "/srv/www/vhosts/server2"> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory> <VirtualHost 1.1.1.1:443> ... DocumentRoot "/srv/www/vhosts/server1" ... SSLCertificateFile /etc/apache2/ssl.crt/server1.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key ... </VirtualHost> <VirtualHost 1.1.1.2:443> ... DocumentRoot "/srv/www/vhosts/server2" ... SSLCertificateFile /etc/apache2/ssl.crt/server2.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server2.key ... </VirtualHost> </IfDefine> </IfDefine>
Vorteil: Man kann jedem Virtual Host eigene Keys und SSL-Zertifikate zuordnen.
Named-based Virtual Hosts
Es ist jedoch mit named-based Virtual Hosts zumindest möglich, Server mit verschiedenen DocumentRoot Verzeichnissen aufzusetzen . Allerdings wird dabei immer nur das SSL-Zertifikat des ersten Hosts verwendet, da der Host-Header erst nach dem SSL-Handshake ausgewertet wird (so dass es am Client ggf. eine Fehlermeldung gibt).
Die Konfig sieht dann so aus:
NameVirtualHost *:443
<IfDefine SSL> <IfDefine !NOSSL> <Directory "/srv/www/vhosts/server1"> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory> <Directory "/srv/www/vhosts/server2"> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory> <VirtualHost *:443> ... DocumentRoot "/srv/www/vhosts/server1" ... SSLCertificateFile /etc/apache2/ssl.crt/server1.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key ... </VirtualHost> <VirtualHost *:443> ... DocumentRoot "/srv/www/vhosts/server2" ... SSLCertificateFile /etc/apache2/ssl.crt/server1.crt SSLCertificateKeyFile /etc/apache2/ssl.key/server1.key ... </VirtualHost> </IfDefine> </IfDefine>
SSL-Proxy
Das Problem mit mehreren IP-Adressen kann man umgehen, wenn man das Modul mod_rewrite einsetzt, um einen "SSL-Proxy" zu bauen. Siehe z.B. http://www.serversupportforum.de/forum/faqs-anleitungen/2558-howto-ssl-proxy.html.
Nachteil: Unschöne URLs.
mod_rewrite
siehe
- http://www.whoopis.com/howtos/apache-rewrite.html
- http://www.webhostgear.com/109.html
- http://www.pro-linux.de/news/2006/9325.html
- http://www.modrewrite.de/foren/ftopic82.html
Alle Zugriffe von Port 80 auf Port 443 (SSL) umleiten
RewriteEngine on RewriteCond %{SERVER_PORT} =80 RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI}
bzw.
RewriteEngine on RewriteCond %{SERVER_PORT} !^430$ RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI}
Diese Konfig funktioniert auch im <Directory>-Kontext, um z.B. nur eine bestimmte URL umzuleiten. Die folgende Konfig leitet nur http://www.kruedewagen.de/path auf https://www.kruedewagen.de/path um (und alle Unterverzeichnisse):
Alias /path /usr/share/path <Directory /usr/share/path/> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [L,R] </Directory>
Ein / am Ende der URL einfügen
RewriteEngine on RewriteRule ^/url$ http://www.mydomain.de/url/ [R]
Logging
Um rewrite Logging einzuschalten (für gesamten Server oder auf Virtual Host Ebene):
RewriteEngine on RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 2
Authentifizierung
Wenn man eine Basic-Authentifizierung für ein Verzeichnis eingerichtet hat, gilt das normalerweise auch für alle Unterverzeichnisse. Man kann jedoch die Abfrage von Username/Passwort für Unterverzeichnisse ausschließen mittels:
Allow from all Satisfy Any
siehe:
- http://httpd.apache.org/docs/2.2/mod/core.html#satisfy
- http://www.bluestarweb.on.ca/htaccess.html
- http://webmaster.iu.edu/security_info/index.shtml