Nach der Umstellung auf SSL/TLS (siehe “Echtes SSL bei all-inkl aktivieren” und “Wordpress auf SSL umstellen”) musste ich leider feststellen, dass bei der automatischen Weiterleitung auf SSL wieder eine doppelte Abfrage der Credentials erfolgt. Einmal beim Zugriffsversuch auf die unverschlüsselte Seite und das zweite mal nach der Weiterleitung auf SSL/TLS. Der Trick mit der Auswertung HTTP-Header X-Forwarded-Host funktioniert dabei nicht mehr, wenn der Zugriff nicht mehr per SSL/TLS-Proxy sondern direkt erfolgt.

Anmerkung: Die bessere Lösung wäre wohl eine saubere Trennung von SSL und unverschlüsseltem Zugriff im Rahmen der VirtualHost-Konfiguration des  Apache Servers. Da ich aber bei meinem Provider keinen Zugriff auf die Apache-Config habe, musste ich mir mit einem Workaround behelfen.

Mit folgender Einstellungen habe ich die Basic-Authentisierung auf meinem Server so konfigurieren können, dass wieder nur beim Zugriff per HTTPS das Passwort eingegeben werden muss. Dazu habe ich in der .htaccess-Datei im Root-Verzeichnis der Worpress-Installation folgende Einträge vorgenommen:

SSLOptions +StrictRequire
<FilesMatch "(?<!redirect\.php)$">
	SSLRequireSSL
	ErrorDocument 403 /redirect.php
</FilesMatch>

Die SSL-Option in der ersten Zeile stellt sicher, dass zusammen mit der Option SSLRequire oder SSLRequireSSL der Zugriff auch dann nur per SSL/TLS erlaubt ist, wenn in der .htaccess-Datei die Option Satisfy any gesetzt wird.

Der Abschnitt in den Zeilen 2-4 sorgt dann dafür, dass der Zugriff auf die Web-Seite nur noch per SSL/TLS möglich ist. Wird ein Zugriffsversuch ohne SSL/TLS gestartet, so wird dieser dank der Option SSLRequireSSL mit einem HTTP-Fehler 403 (Forbidden) quittiert. Dank der Definition in Zeile 4 führt das dazu, dass die Datei /redirect.php vom Web-Server ausgeliefert wird.

Es bleibt noch anzumerken, dass auf die Datei /redirect.php dank der FilesMatch-Direktive aus Zeile 2 auch unverschlüsselt aufgerufen werden darf.

In der Datei /redirect.php wird mit dem folgenden PHP-Code die eigentliche Weiterleitung auf https realisiert:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER["REQUEST_URI"]);
header("Connection: close");
//phpinfo();
?>

Wichtig ist hierbei, dass mit einem Status-Code 301 geantwortet wird (siehe Zeile 2), damit das bisherige Page-Ranking mit übernommen wird. In der dritten Zeile wird dann die Ziel URL-festgelegt. Somit ist eine Weiterleitung auf HTTPS sichergestellt.

Anmerkung: wurde in der .htaccess bereits vorher schon eine Weiterleitung z.B. per RewriteRule aktiv, so muss diese natürlich deaktiviert werden. 

Danach kann die Basic-Authentisierung aktiviert werden. Der Zugriff auf die Datei /redirect.php darf dabei natürlich nicht eingeschränkt werden. Für meine WordPress-Installation habe ich folgende Einträge in unterschiedlichen .htaccess-Dateien vorgenommen:

<FilesMatch "(wp-config|wp-login)(.*)">
	AuthUserFile /path/to/.htpasswd
	AuthGroupFile /path/to/.htgroup
	AuthName "Backend"
	AuthType Basic
	Require valid user
	Order deny,allow
</FilesMatch>
AuthUserFile /path/to/.htpasswd
AuthGroupFile /path/to/.htgroup
AuthName "Backend"
AuthType Basic
Require valid user
Order deny,allow
satisfy any
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$">
	Allow from All
</FilesMatch>

<FilesMatch "(async-upload|admin-ajax)\.php$">
	<IfModule mod_security.c>
		SecFilterEngine Off
	</IfModule>
	Allow from All
</FilesMatch>