Die perfekte .htaccess Datei für optimale Pagespeed Einstellungen und rewrite URLs

Technik
Die perfekte .htaccess Datei für optimale Pagespeed Einstellungen und rewrite URLs

Die richtige .htaccess-Datei beschleunigt eure Website und verbessert auch Verweildauer und Zufriedenheit der Besucher. Auch Google sieht im Page Speed einen wichtigen Rankingfaktor für die Suchergebnisse.

Da es nicht ganz einfach ist, sich durch die Apache-Dokumentation zu arbeiten, könnt ihr hier die - meines Erachtens - optimalen .htaccess Einstellungen kopieren. Die Einstellungen sind optimiert für die Shared Server von domainFACTORY - Premium Hosting. Premium Service. Sollten der Fehler 500 internal server error auftreten, wird ein Teil der Einstellungen von eurem Hoster nicht unterstützt. Das entsprechende Modul ist dann nicht installiert oder kann von euch nicht verwendet werden (Ich habe bewusst auf die IF-Module-Prüfung verzichtet, damit ihr sofort merkt, ob alle Einstellungen auch angenommen werden).

DirectorySlash On

# Komprimierung: deflate/gzip
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

#  Header
Header append Vary Accept-Encoding
Header append Vary User-Agent
Header set Connection keep-alive
Header unset ETag
FileETag None

<FilesMatch "\.(htm|html|php)$">
Header append Cache-Control private
#Header set Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0, private
</FilesMatch>

# Cache control
ExpiresActive On
ExpiresDefault A0
ExpiresByType text/css A2592000
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/x-icon A2592000
ExpiresByType text/plain A2592000
ExpiresByType text/javascript A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000

# Rewrite Rules
RewriteEngine On
RewriteBase /

# forward non-www to www
RewriteCond %{HTTP_HOST} ^([a-z-]+)\.(com|de|at|org|net|eu)$ [NC]
RewriteRule ^(.*)$ http://www.%1.%2/$1 [R=301,L,QSA]

# forward template.12345.css to css.min.css
RewriteRule ^css/template(-[0-9]+)?.css$ css/template.min.css [NC,L,QSA]

# rewrite url and add trailing slash
RewriteRule ^/?$ index.php?q=index [L,NC,QSA]
RewriteRule ^([a-z0-9\+\/_-]+)([^\/])$ $1$2/ [R=301,L,QSA]
RewriteRule ^([a-z0-9\+\/_-]+)$ index.php?q=$1 [L,NC,QSA]

# custom error documents
ErrorDocument 404 /index.php?q=e404
ErrorDocument 410 /index.php?q=e410

Erläuterungen

DirectorySlash On: Behandelt das Fehlen oder Vorhandensein eines Slash am Ende der URL gleich.

Komprimierung: (Statische) Textdateien werden komprimiert. So wird bei der Übertragung Datenvolumen gespart. Durch Fehler in bestimmten Browsern muss mit BrowserMatch für diese eine Ausnahme geschaffen werden.

Header: Proxys sollen nach dem Encoding und User-Agent unterscheiden (vary). Zudem wird versucht keep-alive zu aktivieren (beschleunigt das gleichzeitige Laden von Serverressourcen, z.B. Bildern). Da in diesem Beispiel für das Caching die Expires Direktive verwendet wird, benötigen wir keinen ETag. Bestimmte Dateien sollen jedoch nicht gecached werden. Besonders dynamische PHP Dateien nicht. Wenn euer PHP-Code eine Session erzeugt, solltet ihr die erste Zeile aktiv lassen. Wenn ihr keine Sessions verwendet, solltet ihr die zweite Zeile innerhalb der FilesMatch Direktive aktivieren.

Cache control: Google empfiehlt die Expires Methode der max-age Methode vorzuziehen. Die Ablaufdauer wird in Sekunden angegeben. In diesem Beispiel beträgt sie einheitlich 30 Tage für Bilder, JavaScript, Styledateien, PDF, etc. Ein Jahr sollte keinesfalls überschritten werden. Alle nicht angegebenen Dateitypen haben eine Ablaufdauer von 0, werden also nicht gecached. 

mod_rewrite: Hiermit können schöne URLs erzeugt werden. Statt /index.php?seite_id=1 kann dann /seite/unterseite/ erzeugt werden, ohne die Dateistruktur verändern zu müssen.

Zuerst werden Seiten, die nicht mit www beginnen auf die www Version weitergeleitet. Dadurch vermeiden wir Duplikate.

Die nächsten Zeilen behandeln die CSS-Dateien. Da wir diese im Cache des Users speichern, müssen wir bei jeder Änderung den Dateinamen ändern. So kann in diesem Beispiel die Datei /css/template-20140626.css aufgerufen werden, tatsächlich wird aber die Datei /css/css.min.css geladen. Ändert ihr nun den Inhalt der Styledatei, müsst ihr nur mehr die Zahl im Dateinamen ändern. Hierzu bietet sich die filemtime-Funktion an.

Nun der eigentliche wichtige URL-Rewrite. In diesen 3 Zeilen werden alle URLs (ohne Dateiendung) auf die index.php Datei umgeschrieben. Die URL darf dabei nur aus Buchstaben, Zahlen, Sträg-, Binde- und Unterstrichen bestehen. Ausgelesen kann die URL dann mittels $_GET['q'] werden. Mit explode('/', $_GET['q']) kann die URL in die einzelnen Bestandteile aufsplittet werden.

Solltet ihr Verbesserungsvorschläge haben, schreibt einfach einen Kommentar.

Links:

Permalink: https://to.ptmr.io/1lRv5BE