Ich brauche zwei Weiterleitungen für die Seite: Erstens habe ich jetzt ein Zertifikat. Deshalb sollen die Leute auch HTTPS verwenden. Zweitens möchte ich die Subdomain "www" erzwingen.

Dabei gibt es mehrere Lösungsansätze: Man kann über das HTML weiterleiten, d.h. der Browser lädt eine Seite, die ein Meta-Tag enthält. Dieses Tag leitet den Browser an, eine andere Seite zu öffnen - in diesem Fall die mit https und der richtigen URL. Das ist nicht gut, denn es kostet zusätzliche Zeit, den HTML-Quelltext zu laden.

Die zweite Möglichkeit ist, einzustellen, dass Grav die falsche URL erkennt, und aus dem PHP mit einem HTTP-301-Status zu antworten. Im Admin-Panel ist dazu angemerkt, dass das nicht die beste Möglichkeit ist, diese Funktion umzusetzen. Die Antwort mit Status 301 (permanent verschoben) lässt sich nämlich schon auf einer Ebene tiefer erzeugen: Im Webserver.

Dazu wird die Datei .htaccess verwendet, die im Webroot liegt. In der Grav-Standardinstallation ist sie bereits mit einiger Konfiguration gefüllt, die die Sicherheit erhöhen soll.

Um die Weiterleitungen zu konfigurieren, muss man den Block <IfModule mod_rewrite.c> ... </IfModule> erweitern. Dort lassen sich Weiterleitungsregeln erstellen. HTTPS erzwingen kann man mit den Zeilen

RewriteCond ${HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Das bedeutet so viel wie: Unter der Bedingung, dass die Anfrage ohne HTTPS geschieht, leite alle Anfragen für Pfade, auf die der reguläre Ausdruck .* passt (also alle), zu https://%{HTTP_HOST}%{REQUEST_URI} weiter. HTTPS_HOST und REQUEST_URI sind dabei Variablen, in denen die originale Anfrage steht.

Die Weiterleitung von afuchs.de auf www.afuchs.de ist wichtig, damit Suchmaschinen die Website nicht zweimal unter verschiedenen URLs sehen. Im besten Fall werden beide als Ergebnis angezeigt. Im schlimmeren Fall wird die Website abgewertet, da sie Duplicate Content enthält. Diese Weiterleitung geschieht mit:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Die Bedingung ist dabei, dass der Inhalt von HTTP_HOST, in meinem Fall immer afuchs.de, nicht auf den Ausdruck ^www\. passt, also nicht mit "www." anfängt. Die Anfrage wird dann direkt auf die https-Seite weitergeleitet und das "www." angefügt.

Noch eine Warnung: Die Position innerhalb des <IfModule mod_rewrite.c>-Blocks ist durchaus wichtig. Er wird von oben nach unten abgearbeitet. Platziert man die vier Zeilen z.B. nach dem Grav-Index-Block, der alle Anfragen nach index.php weiterleitet, dann wird z.B. ein Besucher, der afuchs.de/b aufruft, eine Fehlermeldung erhalten: Zuerst wird die Anfrage auf afuchs.de/index.php umgeschrieben. Dabei bleibt der angefragte Ort /b erhalten. Dann wird auf https://www.afuchs.de/index.php weitergeleitet, aber index.php ist in diesem Fall ja gar keine richtige Seite.

Previous Post Next Post