.htaccess und Mod-Rewrite für CMS und Blog
Der folgende Artikel zeigt anhand vieler Beispiele, wie Weiterleitungen und andere hilfreiche Dinge mittels .htaccess und mod_rewrite eingerichtet werden können.
Inhalt
- Nicht verfügbare Subdomains auf Hauptdomains umleiten oder www loswerden
- Immer einen abschließenden Schrägstrich hinzufügen
- Diverse Weiterleitungen
- HTTPS vermeiden
- HTTPS erzwingen
- Hotlinking unterbinden
- Seiten gemäß Referrer blocken
- Wartungs-Seite einrichten
- Zugriffschutz einrichten
- Weitere .htaccess- und Mod-Rewrite-Informationen im Web
1. Nicht verfügbare Subdomains auf Hauptdomains umleiten oder www loswerden
Bei einigen Hostern erfolgt beim Aufruf einer nicht vorhandenen Sub-Domain, z.B. http://subdomain.domain.tld
, keine Fehlermeldung o.ä., sondern es wird der gleiche Inhalt wie beim Aufruf der Hauptdomain (http://domain.tld/
) ausgegeben. Dies kann u.a. aus SEO-Sicht problematisch sein, da Suchmaschinen wie Google dies als doppelten Content werten und die Seite entsprechend bestrafen könnten.
Außerdem sollte man vermeiden, dass eine Webseite sowohl unter http://domain.tld
als auch http://www.domain.tld
erreichbar ist, ein Aufruf der ungewünschten URL (je nach Belieben mit oder ohne www) sollte automatisch auf die gewünschte URL umleiten.
Lösung für Seiten ohne www (http://domain.tld
):
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.tld$ [NC]
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L]
Lösung für Seiten mit www (http://www.domain.tld
):
RewriteCond %{HTTP_HOST} !^www\.domain\.tld$ [NC]
RewriteRule ^(.*)$ http://www.domain.tld/$1 [R=301,L]
Eine bestimmte Subdomain kann man wie folgt von der Regel ausschließen, Beispiel 1 (http://domain.tld
):
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.tld$ [NC] [OR]
RewriteCond %{HTTP_HOST} !^subdomain\.domain\.tld$ [NC]
RewriteRule ^(.*)$ http://domain.tld/$1 [R=301,L]
Subdomain ausschließen, Beispiel 2 (http://www.domain.tld
):
RewriteCond %{HTTP_HOST} !^www\.domain\.tld$ [NC] [OR]
RewriteCond %{HTTP_HOST} !^subdomain\.domain\.tld$ [NC]
RewriteRule ^(.*)$ http://www.domain.tld/$1 [R=301,L]
2. Immer einen abschließenden Schrägstrich hinzufügen
Wenn das Content-Management- oder Blog-System Artikel-URLs wie etwa http://blog-cms.de/2007/hallo-welt/
verwendet, kann i.d.R. der abschließende Schrägstrich beim Seitenaufruf weggelassen werden. Allerdings hat dies aus SEO-Sicht Nachteile (doppelter Content), außerdem zeichnen Webseiten-Statistik-Tools Zugriffe für 2 unterschiedliche Seiten auf.
Abhilfe schaft folgende Regel, die immer einen abschließenden Schrägstrich hinzufügt:
# Add trailing slash
RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [R=301,L]
3. Diverse Weiterleitungen
- Geänderter Verzeichnispfad (1):
Angenommen man möchte alle Aufrufe vonhttp://domain.tld/tipps/browser/
weiterleiten aufhttp://domain.tld/software/firefox/
, so nimmt man folgende Regel:RewriteRule ^tipps/browser/?$ /software/firefox/ [R=301,L]
- Geänderter Verzeichnispfad (2):
Möchte man alle Aufrufe vonhttp://domain.tld/tipps/browser/
und allen Unterseiten (z.B.http://domain.tld/tipps/browser/unterseite/
) weiterleiten aufhttp://domain.tld/software/firefox/
, so nimmt man folgende Regel:RewriteRule ^tipps/browser/(.*)$ /software/firefox/ [R=301,L]
- Geänderter Verzeichnispfad (3):
Möchte man alle Aufrufe vonhttp://domain.tld/tipps/browser/
und allen Unterseiten (z.B.http://domain.tld/tipps/browser/unterseite/
) weiterleiten aufhttp://domain.tld/software/firefox/
und zudem die Unterseite(n) mit übertragen (also z.B. umhttp://domain.tld/software/firefox/unterseite/
zu erreichen), so nimmt man folgende Regel:RewriteRule ^tipps/browser/(.*)$ /software/firefox/$1 [R=301,L]
- Unterverzeichnis auf Hauptseite umleiten:
Möchte man alle Aufrufe vonhttp://domain.tld/tipps/browser/
an die Hauptseitehttp://domain.tld
weiterleiten, so kann man folgende Regel anwenden:RewriteRule ^tipps/browser/?$ / [R=301,L]
- Geänderte Permalink-Struktur:
Wir nehmen an, dass die Artikel-URL in einem Blog wie folgt aufgebaut ist:http://domain.tld/2007-01-31/artikel-titel/
, dabei entsprechen die Zahlen dem Jahr, Monat und Tag, an dem die Artikel geschrieben worden sind. Nun soll diese Struktur geändert werden inhttp://domain.tld/blog/2007-01-31/artikel-titel/
. Umsetzungsmöglichkeit:RewriteRule ^200(6|7)-([0-9]{2})-([0-9]{2})/(.*)$ /blog/200$1-$2-$3/$4 [L,R=301]
- Weiterleitung einer Webseite einschließlich aller Unterseiten auf eine andere Domain (1):
Möchte man sämtliche Aufrufe einer Webseite auf die Hauptseite einer anderen Domain umleiten, so kann man folgende Regel verwenden:RewriteRule ^(.*)$ http://domain.tld/ [R=301,NC,L]
- Weiterleitung einer Webseite einschließlich aller Unterseiten auf eine andere Domain (2):
Wenn eine Webseite auf eine neue Domain umgezogen ist, also z.B. vonhttp://domain.tld
aufhttp://domain-neu.tld
, so kann man folgende Regel verwenden, um alle Aufrufe korrekt auf die neue Domain weiterzuleiten:RewriteCond %{HTTP_HOST} ^domain.tld$ [NC] RewriteRule ^(.*)$ http://domain-neu.tld/$1 [R=301,L]
Beispiel-Einsatz dieser Regel: Man hat eine neue Domain reserviert, will aber dort noch keine Webseite betreiben, sondern jeden Aufruf auf eine andere Webseite umleiten.
4. HTTPS vermeiden
Möchte man die Verwendung von HTTPS vermeiden bzw. Aufrufe der Seite via https auf http umbiegen, so kann man folgende Regel verwenden:
RewriteCond %{SERVER_PORT} !^80$
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
5. HTTPS erzwingen
Möchte man für eine (Sub)Domain erreichen, dass bei jedem Seitenaufruf als Protokoll immer https und nicht http verwendet wird, so kann man folgende Regel anwenden:
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
6. Hotlinking unterbinden
Um Hotlinking, also das Einbetten von Bildern auf einer fremden Website, zu unterbinden, kann man folgende Regel anwenden:
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?domain\.tld/ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?bloglines\.(de|com)/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]
Allerdings werden dadurch beispielsweise auch im Feedreader keine Grafiken mehr angezeigt. Man kann aber z.B. gängige Online-Feedreader von der Regel ausschließen, im obigen Beispiel wird Bloglines ausgeschlossen.
Möchte man bei Hotlinking eine Alternativ-Grafik anzeigen lassen, so ersetzt man die letzte Zeile durch
RewriteRule .*\.(jpe?g|gif|bmp|png)$ images/hotlinking.gif [L]
, wobei images/hotlinking.gif
der Dateipfad zur Alternativgrafik ist.
7. Seiten gemäß Referrer blocken
Mit folgender Regel kann man bestimmte Webseiten gemäß Referrer blocken, um z.B. Hotlinking nicht generell zu unterbinden, aber bestimmten Webseiten auszuschließen.
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?domain1\.tld/ [NC]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?domain2\.tld/ [NC]
RewriteRule .* - [F]
Möchte man stattdessen den Zugriff erlauben und nur für Bild-Dateien verbieten, so ersetzt man die letzte Zeile durch RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]
.
8. Wartungs-Seite einrichten
Möchte man die Seite vor sämtlichen Zugriffen sperren aber selbst Zugriff auf die Seite haben, so kann man sich wie folgt behelfen:
Man lädt in das Hauptverzeichnis eine HTML-Datei hoch, z.B. wartung.html, mit der man einen entsprechenden Wartungshinweis ausgibt. Nun lädt man eine .htaccess-Datei mit folgendem Inhalt in das Hauptverzeichnis hoch (die ggf. bereits bestehende .htaccess-Datei benennt man zuvor um):
RewriteCond %{REMOTE_ADDR} !=11.12.13.14
RewriteCond %{REQUEST_URI} !=/wartung.html [NC]
RewriteRule ^(.*)$ /wartung.html [R=302,NC,L]
Die Zahl 11.12.13.14
entspricht dabei der eigenen IP-Adresse. D.h. dass alle Besucher auf wartung.html
umgeleitet werden bis auf die Besucher mit der angegebenen IP-Adresse.
9. Zugriffschutz einrichten
Auf einem Apache-Server ist es sehr einfach, einen sicheren Zugriffschutz einzurichten, d.h. dass beim Aufruf der Seite ein Login-Fenster erscheint, wo Benutzername und Passwort eingegeben werden muss.
Vorgehensweise:
- .htpasswd-Datei erzeugen: In dieser Datei werden alle Benutzer-Accounts (Namen und Passwörter) gespeichert. Die dort hinterlegten Passwörter werden mit einer Hash-Funktion umgewandelt, so dass das tatsächliche Passwort nicht ausgelesen werden kann. Es gibt u.a. viele Webdienste, die den Inhalt für die .htpasswd-Datei erzeugen können, einer davon ist .htpasswd Generator von www.phpbb.de. Den damit erzeugten Text kopiert man in eine leere Textdatei, speichert diese unter ‚.htpasswd‘ (ohne .txt!) ab und lädt sie per FTP z.B. in das Verzeichnis hoch, welches man schützen möchte.
- .htaccess-Datei erzeugen: Nun wird noch eine .htaccess-Datei benötigt, welche man wie die .htpasswd-Datei mittels leerer Textdatei erzeugt. Möglicher Inhalt:
# Authentification AuthName "Meine Webseite" AuthType Basic AuthUserFile /www/html/ordner/unterordner/.htpasswd require valid-user
Unter ‚AuthName‘ kann man einen beliebigen Titel eingeben, der dann im Login-Fenster erscheint. Unter ‚AuthUserFile‘ muss der absolute Root-Pfad des Servers zur .htpasswd eingegeben werden.
Nachdem man nun diese .htaccess-Datei in das zu schützende Verzeichnis hochlädt, ist der Zugriffschutz aktiv.Man kann übrigens auch einzelne Seiten vor dem Zugriffschutz ausschließen, die .htaccess-Datei sieht dann z.B. wie folgt aus:
# Authentification AuthName "Meine Webseite" AuthType Basic AuthUserFile /www/html/ordner/unterordner/.htpasswd <Files *.*> require valid-user </Files> <Files ~ "(_401.html|_404.html)"> satisfy any </Files>
In diesem Beispiel sind alle Zugriffe geschützt bis auf die Dateien
_401.html
und_404.html
. Wie zu sehen, werden mehrere Dateien mit einem senkrechten Strich (Pipe: |) getrennt.
10. Weitere .htaccess- und Mod-Rewrite-Informationen im Web
- Module mod_rewrite URL Rewriting Engine: Offizielle Dokumentation des Apache HTTP Server zu Mod-Rewrite
- modrewrite.de Forum: Deutschsprachiges Mod-Rewrite-Forum
- Apache htaccess Ultimate Guide: Viele weitere Beispiele zu .htaccess und Mod-Rewrite.
- mod_rewrite Cheat Sheet: Cheat Sheet von ILoveJackDaniels.com, wo auch einige Cheat Sheets zu anderen Themen angeboten werden.
Was ist ein Trackback?
20 Trackbacks/Pings:
1
.htaccess und mod_rewrite: viele Beispiele für Blogs und CMS — Software Guide
Pingback vom 14. Mai 2007, 10:00