Die Regel war da, sie war richtig geschrieben, und sie tat auch etwas. Nur nicht das, was auf dem Zettel stand.
Der Aufbau
Eine .htaccess, die mehrere Auftritte auf einem Dokumentenstamm bedient, enthält früh eine Weiche: Sie erkennt den angefragten Hostnamen und schreibt die Anfrage intern auf das passende Verzeichnis um. Solche Umschreibungen enden fast immer mit dem Schalter L – der Durchlauf soll hier aufhören, die Zuordnung steht ja fest.
Weiter unten, im Abschnitt mit den Aufräumregeln, standen die beiden kanonischen Weiterleitungen: auf HTTPS und auf die www-Fassung. Dort stehen sie in vielen Konfigurationen, weil neue Regeln unten angehängt werden.
Was tatsächlich passiert
L beendet den Durchlauf – aber nicht die Bearbeitung. Wurde die Adresse verändert, beginnt Apache von vorn, mit der neuen, internen Adresse. Und in diesem zweiten Durchlauf erreicht die Anfrage endlich die kanonischen Regeln am Dateiende. Sie greifen dann auf einer Adresse, die es nach außen nie geben sollte.
Aufruf über http und ohne www:
http://domain/leistungen
→ https://www.domain/sites/_root/leistungen.html
→ /leistungen.html
→ /leistungen
Drei Sprünge, wo einer gereicht hätte. Und die zweite Station zeigt dem Besucher wie der Suchmaschine, wie die Verzeichnisse tatsächlich heißen.
Warum das lange unbemerkt bleibt
Weil das Ergebnis stimmt. Wer die Adresse im Browser eintippt, landet auf der richtigen Seite unter der richtigen Adresse. Die Kette dazwischen sieht niemand, der nicht danach sucht.
Auffällig wird es an anderer Stelle: in der Ladezeitmessung, wo drei Sprünge vor dem ersten Byte stehen. Oder wenn die interne Adresse in einem Bericht auftaucht und niemand erklären kann, wo sie herkommt.
Die Behebung
- Beide Regeln nach oben ziehen
Unmittelbar hinter RewriteBase /, also vor jede interne Umschreibung. Dann greifen sie im ersten Durchlauf, auf der Adresse, die der Besucher tatsächlich angefragt hat.
- Beide Bedingungen in einer Regel prüfen
Wer HTTPS und www in zwei getrennten Regeln behandelt, erzeugt bei einem Aufruf ohne beides zwangsläufig zwei Sprünge. Eine Regel, die den Zielhost vollständig zusammensetzt, kommt mit einem aus.
- Kette nachzählen
Nach der Änderung den ungünstigsten Fall aufrufen – ohne HTTPS, ohne www, mit abschließendem Schrägstrich – und die Sprünge verfolgen. Ziel ist genau einer.
Die übertragbare Regel
Das gilt unabhängig vom eingesetzten System. Sobald eine Konfiguration eine interne Umschreibung enthält, ist die Position der kanonischen Regeln keine Geschmacksfrage mehr, sondern entscheidet darüber, worauf sie angewendet werden.