.htaccess für TYPO3

Ich möchte auf dieser Seite nicht erklären wie .htaccess-Dateien erstellt werden. Nein. Davon gibt es schon zu genüge Dokumentationen im Web:

Allgemeines zu htaccess

URLs manipulieren

Reguläre Ausdrücke

htaccess Beispiele

Auf dieser Seite geht es mehr um das Zusammenspiel von TYPO3 und htaccess-Dateien gerade in Bezug unter der Verwendung von der Extension RealUrl. In den nächsten Zeilen werde ich Euch meine htaccess-Datei in Detail näher erklären:

RewriteEngine

Mit RewriteEngine kannst Du das Modifizieren von URLs de- bzw. aktivieren. Erst wenn diese Option aktiviert ist, kannst du z.B. alle Anfragen, die an Deinen Server gesendet werden auf eine völlig andere Webseite umleiten.

RewriteEngine On

Bestimmte Verzeichnisse nicht umschreiben

Wenn Ihr RealUrl installiert habt, dann erhaltet Ihr je nach Konfiguration URLs wie

/meine-seite/kontakt/impressum.html

Dabei sind die vermeintlichen Ordner gar keine echten Ordner auf dem Server, sondern Informationen, die an die index.php weitergeleitet werden, um dann die gewünschte Seite aufrufen zu können. Was aber, wenn wir wirklich mal einen Ordner auf dem Server öffnen wollen? Dann darf dieser Name des Ordner NICHT an die index.php weitergeleitet werden. Um das zu erreichen verwende ich das Script aus der RealUrl-Dokumentation:

RewriteRule ^typo3$ - [L]
RewriteRule ^typo3/.*$ - [L]
RewriteRule ^uploads/.*$ - [L]
RewriteRule ^fileadmin/.*$ - [L]
RewriteRule ^typo3conf/.*$ - [L]

Hinweis

[L] bedeutet, dass nach dieser Umschreibung der URL keine weiteren Umschreibungen mehr ausgeführt werden.

Der Bindestrich (-) bedeutet, dass keine Umschreibung der URL stattfinden soll.

Doppelter Content

Wer von Euch seine Seite schon mal mit www.seitwert.de bewertet hat, wird bestimmt schon mal über den Eintrag bzgl. doppelten Content/Inhalt gestoßen sein. So kommt es je nach Konfiguration vor, dass eine Seite wie sfroemken.de das Gleiche anzeigt wie www.sfroemken.de. Dieses "Problem" kann sich auch negativ auf die Position in den Suchergebnissen auswirken. Aber auch das lässt sich mit Hilfe der htaccess-Datei bereinigen:

RewriteCond  %{HTTP_HOST} ^sfroemken\.de$ [NC]
RewriteRule ^(.*)$ www.sfroemken.de/$1 [R=301,L]

Erklärung

%{HTTP_HOST} kann in diesem Fall sfroemken.de oder aber auch www.sfroemken.de sein. Mit RewriteCond könnt Ihr nun überprüfen, ob der HTTP_HOST mit dem Wert sfroemken.de übereinstimmt. Dank [NC] soll die Groß- und Kleinschreibung bei diesem Vergleich nicht berücksichtigt werden.

Wenn RewriteCond nun ein true zurück gibt, dann wird die Modifikation in RewriteRule ausgeführt. Alles was durch die Klammern markiert wurde, kann im zweiten Parameter mit $1 wiederverwendet werden. [R=301]: Das R steht für redirect und die 301 ist ein bestimmter Servercode, mit dem bestimmt wird, dass es sich bei dieser Weiterleitung um eine parmanente Weiterleitung handelt.

So wird aus

sfroemken.de/kontakt/index.php

ein

www.sfroemken.de/kontakt/index.php

Subdomains

Bei Subdomains müssen wir das genau andersrum machen. Dort gibt es kein www. Da www.seitwert.de aber trotzdem überprüft, ob die Domain auch mit einem www davor erreichbar ist, müssen wir das folgendermaßen abfangen:

RewriteCond  %{HTTP_HOST} ^www\.typo3\.sfroemken\.de$ [NC]
RewriteRule ^(.*)$ typo3.sfroemken.de/$1 [R=301,L]

Ordner

Leider haben sich viele Surfer daran gewöhnt Ordner auf einem Server ohne abschließendem Slash (/) anzugeben. Damit dieser Slash automatisch hinten dran gemacht wird, können wir folgendes Script verwenden:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (.*[^/])$ %{HTTP_HOST}/$1/ [L,R]

Erklärung

Die ersten beiden RewriteCond fragen ab, ob es sich bei der aufzurufenden URL nicht um eine Datei handelt und nicht um einen symbolischen Link. Wenn beides zutrifft, kann getrost ein zusätzlicher Slash hinten angefügt werden.

Achtung

Wenn Ihr RealUrl so konfiguriert habt, dass Ihr URLs wie

/kontakt/impressum.html

erhaltet, dann muss das Script noch etwas angepasst werden, dann ansonsten erhaltet Ihr eine URL wie diese hier:

/kontakt/impressum.html/

Hier das angepasste Script:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} (^.htm$|^.html$)
RewriteRule (.*[^/])$ %{HTTP_HOST}/$1/ [L,R]

Heißt: Wenn die URL mit .htm oder .html endet, dann soll der zusätzliche Slash NICHT hinten dran gemacht werden.

Index-Dateien in Ordnern

Je nach Projekt und Ordner kann es vorkommen, dass Du trotz RealUrl die Index-Dateien in bestimmten Ordnern ausführen möchtest:

/fileadmin/projekt/download/index.php

Allerdings wird derzeit noch diese URL an die TYPO3-eigene index.php im Rootverzeichnis weitergeleitet. Um auch das zu unterbinden sind folgende 6 Zeilen vorgesehen:

RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule / %{REQUEST_URI}/index.html [L]
RewriteCond %{REQUEST_FILENAME}/index.htm -f
RewriteRule / %{REQUEST_URI}/index.htm [L]
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule / %{REQUEST_URI}/index.php [L]

URL-Modifikation für RealUrl

Dieses Script ist das wichtigste Script überhaupt für RealUrl. Hier wird nun endlich gesagt, dass alle Teile aus der URL an die TYPO3-eigene index.php weitergeleitet werden sollen zur Weiterverarbeitung durch RealUrl.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php

Hinweis

Je nach Art Eurer TYPO3-Installation könnte es sein, dass Eure index.php ein symbolischer Link ist. In diesem Fall müsst Ihr die letzt Zeile folgendermaßen ändern:

RewriteRule .* /index.php

Scripmerger

Dieses Script benötigt Ihr nur, wenn Ihr die Extension scriptmerger verwenden wollt:

# Expires Header + Removal of ETag
<FilesMatch "\.(ico|png|gif|js|css|jpg|jpeg|swf)">
    <IfModule mod_expires.c>
        ExpiresActive on
        ExpiresDefault "access plus 7 days"
        ExpiresDefault "access plus 2 months"
    </IfModule>

# ETag
  FileETag MTime Size
  <IfModule mod_headers.c>
      FileETag none
      Header unset Last-Modified
    </IfModule>
</FilesMatch>

# Compressed Content
<FilesMatch "\.gz\.(js|css)">
    <IfModule mod_headers.c>
        Header set Content-Encoding gzip
    </IfModule>
</FilesMatch>