Schreck in der Morgenstunde... Ich verwende nicht den URL, sondern schaue gleich auf den Port:
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
In der Browserzeile erscheint auf jeden Fall die Änderung von http auf https (bei Chrome durch das Schloss-Symbol, Firefox nennt explizit zusätzlich https://), und die Verbindung wird auch als mit gültigem Zertifikat ausgestattet angezeigt. Dass die initiale Anfrage "http" noch unverschlüsselt übertragen wurde, ist logisch; die Antwort kommt dann aber verschlüsselt zurück.
Nach dem ersten Schrecken habe ich mich außerdem daran erinnert, dass ich jeden Request nochmals filtere:
if (!(array_key_exists('HTTPS',$_SERVER) && $_SERVER['HTTPS']=='on')) {
header("Location: ".$url_https."error.php?p=403-nossl");
exit();
}
Die Umleitung führt zu einer 403 Fehlerseite (und logt mir den Grund). Das habe ich wohl bei der Umstellung auf SSL eingerichtet und hatte das vorher nur in den zugangsbeschränkten Bereichen.
Dass Redirects/Rewrites am Port oder Host (www redirect) im Browser des Users angezeigt werden, ist mir klar. Aber bei Änderungen am URI sollte das nicht so sein (wenn ich das richtig verstanden habe). Wenn ich Folgendes eintrage:
RewriteCond %{REQUEST_URI} ^/impressum
RewriteRule ^(.*)$ https://example.com/index.php?p=$1 [NC]
dann liefert die Anfrage nach example.com/impressum
zwar example.com/index.php?p=impressum
aus (wie es sein soll), zeigt das aber auch im Browser an (was ich gerade nicht möchte).
Die Seite impressum
(ohne Ergänzungen) gibt es nicht, sie wird vom PHP-Skript index.php
aus dem GET-Parameter p=impressum
generiert.
Wo könnte der Fehler liegen?