Dateiendung in URL mit .htaccess entfernen
Veröffentlicht am Montag, den 3. Oktober 2022
Einführung
Im Artikel zu www-Weiterleitungen zeigte ich schon, wie man mit der .htaccess Datei einfache Weiterleitungen einrichten konnte. Eine kurze Erklärung zu der .htaccess Datei habe ich auch im letzten Artikel gegeben. In diesem Artikel geht es darum Dateiendungen z.B. .php von der URL zu entfernen.
Das wird in der .htaccess Datei auch mittels RewriteCond
und RewriteRule
erledigt.
Umleitungen mittels .htaccess
Folgendes wird in die .htaccess Datei geschrieben:
In der ersten Umleitung wird festgestellt, ob die URL irgendwo eine Dateiendung hat. Zwar würde ein Nutzer nie manuell eine Dateiendung hinzufügen, Website-Crawler jedoch schon und diese zeigen dann aus mehreren URL-Duplikaten nur eine URL in ihren Suchergebnissen. Auch möchte ich als Websitebetreiber verhindern, dass Seiten mit Dateiendung gespeichert und geteilt werden. Sieht einfach kürzer und freundlicher aus.
Zuerst wird RewriteCond
verwendet.
Mit %{THE_REQUEST}
, dem zu testenden String, wird auf eine Apache Variable zugegriffen.
Man kann weitere Variablen in der RewriteCond Dokumentation finden.
Die Variable ist die vollständige Request-Line z.B. "GET /index.html HTTP/1.1"
.
Die Variable wird mit dem regulären Ausdruck gematcht.
In diesem Fall ist hier \.php
ausschlaggebend.
Damit wird geprüft, dass irgendwo die Dateiendung .php vorkommt.
Der Ausdruck (\S*)
bedeutet: Fange alles ab, das NICHT aus Leerzeichen, Tabulatoren usw. besteht.
Damit können wir aus dem Request den kompletten Pfad bis zur Datei abfangen.
Der weitere Ausdruck (\?[\w\d=]+)?\s
ist nur da, falls der Request auch noch eine Query beinhaltet, damit der Request auch noch getroffen wird und damit nur die Pfadangabe gematcht wird.
Das liest sich so: Es kann einen Query-String geben muss es aber nicht
(...)?
. Falls es einen gibt, dann gibt es ein Fragezeichen \?
und mindestens ein Schlüssel-Wert Paar [\w\d=]+
. Es folgt dann noch ein Leerzeichen \s
nach der Pfadangabe.
Damit können wir zur Umleitung kommen. Da wir mit RewriteCond
die Bedingung erfüllt haben, wissen wir, dass eine Umleitung stattfinden soll.
Also wird mit dem Punkt gekennzeichnet, dass uns die URL egal ist.
Der zweite Parameter %1
ist das in der RewriteCond
gespeicherte Wort bzw. Pfad (\S*)
, da es umklammert ist.
Eine solche Variable heißt RewriteCond backreference und wird mit %N
angegeben, wobei 0<=N<=9
.
Der Zugriff auf %0
gibt den ganzen String zurück, mit dem gematcht wurde, deswegen wird eigentlich immer bei %1
angefangen.
Mit [R=permanent,L]
geben wir den Redirect Code (permanent=301) an und die Angabe, dass keine weitere Regel in der .htaccess Datei betrachtet werden sollte (Nach der Weiterleitung wird aber wieder auf .htaccess zugegriffen, da das ja ein ganz neuer Request ist).
Es wird in der Apache Dokumentation empfohlen, wenn R verwendet wird, auch L zu verwenden.
Somit führt der Browser die Umleitung aus und verändert im URL-Fenster auch die URL, da permanent auf eine neue URL zugegriffen werden soll.
Kommen wir nun zur zweiten Umleitung.
Die vier RewriteCond
Bedingungen gehen wir nur ganz schnell durch:
- Ist die angefragte Ressource kein Verzeichnis?
- Ist die angefragte Ressource keine Datei? Wir gehen ja davon aus, dass die Dateiendung fehlt und stellen damit sicher, dass wir nicht z.B. .jpeg umleiten.
- Wenn wir .php zur angefragten Ressource hinzufügen, existiert dann eine solche Datei?
- Endet die angefragte Ressource nicht mit einem Schrägstrich? Verhindert sowas wie https://example.com/xyz.php/
Wenn alle Bedingungen erfüllt sind, dann kann man umleiten. Wir fügen hier zur Request URI einfach die .php Endung an. %{REQUEST_URI}
ist hier wieder eine Apache-Variable. Da standardmäßig die Umleitung mit einem 302 Temporary
gekennzeichnet ist, wird die URL in der Suchleiste des Nutzers nicht verändert.
Man kann auch folgende Umleitung hinzufügen, um Anfragen, die auf https://example.com/xyz.php/ enden, direkt mit einem 404 Fehlercode zu beantworten:
Das führt dazu, dass eine Anfrage, die kein Verzeichnis ist und mit einem Schrägstrich endet, abgelehnt wird.
Mit . -
in der RewriteRule
geben wir an, dass die URL egal ist .
und dass keine Umleitung stattfindet -
.
Der einzige Nutzen ist hier also für den Redirect Code.
Wenn man das angibt, dann bräuchte man theoretisch die vierte RewriteCond
der vorletzten Umleitung nicht, da das hier schon abgefangen wird.
Man sollte diese Regel bloß weiter oben, als die beiden anderen angeben, da die Umleitungen in der Reihenfolge abgearbeitet werden, in der sie angegeben werden.
Das muss man nicht machen, aber der Gedanke ist hier wieder keine Verdoppelung von URLs für den selben Inhalt. Ich glaube, dass Apache von sich aus automatisch die Request-URI korrigiert, falls hier ein Schrägstrich zu viel angegeben wurde.
Möchte man, dass diese Umleitungen für alle Unterverzeichnisse gelten, die auch eine .htaccess Datei besitzen, sollte man ebenfalls RewriteOptions InheritDown
angeben.
Fazit
Wie man sehen kann, ist die .htaccess Datei mit mod_rewrite ein sehr mächtiges Werkzeug, um URLs zu verändern und Zugriffe auf bestimmte Inhalte so zu verändern, wie man es erlaubt.
Um einen besseren Überblick zur Funktionsweise von RewriteCond
und RewriteRule
zu bekommen, lohnt sich auf jeden Fall ein Blick in die mod_rewrite Einführung und die mod_rewrite Dokumentation.
Wie im letzten Artikel gebe ich hier ein paar Links zu regulären Ausdrücken, da sie in vielen Einsatzbereichen in der Programmierung vorkommen und sehr mächtig sind. Sie erlauben eine deklarative Verarbeitung von Strings, indem angegeben wird, wie der angegebene String aufgebaut sein soll, statt einer imperativen Vorgehensweise, die z.B. über den String iteriert und mit Indexen arbeitet.