Suche
Suche Menü

Servereinstellungen per .htaccess

1. Was ist .htaccess?

Durch die Verwendung von .htaccess kann man die Vorgaben, die auf dem Server konfiguriert sind, ändern. Dadurch kann man z.B. eine eigene Error-Seite verwenden, Aussehen der Verzeichnislistings verändern oder eine andere Dateiendung als SSI betrachten zu lassen.
Die Datei in der die Änderungen stehen, heisst normalerweise .htaccess. Dieses Verfahren ist vor allem dazu gedacht, dass Benutzer Vorgaben für ihr ‹public_html›-Verzeichnis ändern können. Die .htacces Datei im ‹public_html› Verzeichnis ändert die Einstellungen für die gesamte Homepage. Durch .htaccess Dateien in den Unterverzeichnissen werden ihre Funtionen wieder ausser Kraft gesetzt.

2. Weiterleitungen (Redirect)

2.1 Die Parameter: 301 oder 302 Weiterleitung?

Der Weiterleitung (Redirect) gibt man einen Statuscode mit: 301 oder 302. Worin liegt der Unterschied? 

301: Die Weiterleitung ist dauerhaft, z.B. wenn eine neue Webseite mit einer anderen Struktur in Betrieb genommen wird. Durch den 301 erhält die Suchmaschine die Information, dass die Information unter einer neuen URL abrufbar ist und wird somit auf Dauer auch nur noch die neue URL anzeigen.

302: Die Weiterleitung erfolgt nur vorübergehend, anschliessend gilt wieder die bisherige Adresse.

2.2 Aufbau des Redirects auf eine neue URL

Ein Redirect fordert beim Aufruf eines passenden URL-Pfades den Browser auf, die Ressource über eine andere URL anzufordern. Die Direktive erwartet die Angabe eines alten URL-Pfades, der neuen URL und ggf. eines Statuscodes. Syntax:

Redirect status  alter_URL-Pfad  URL

Der alte URL-Pfad (d. i. der Teil der URL nach Hostname + Port, case-sensitiv) beginnt mit einem Slash (/). Die neue URL geben Sie am besten als absoluten Pfad an. Default-Einstellung für den Statuscode ist „302“ bzw. „temp“ (temporäre Weiterleitung) – 301-Redirects müssen deshalb explizit angegeben werden! Einige Beispiele:

# Redirect auf eine neue Seite

Redirect 301 /altes-verzeichnis/alte-seite.html http://www.meine-domain.tld/neues-verzeichnis/neue-seite.html

#Redirect auf eine neue Domain

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^alteseite.ch$ [OR]
RewriteCond %{HTTP_HOST} ^www.alteseite.ch$
RewriteRule (.*)$ http://www.neueseite.ch/$1 [R=301,L]

# Redirect auf ein neues Verzeichnis

Redirect 301 /altes-verzeichnis/ http://www.meine-domain.tld/neues-verzeichnis/

# Redirect aller Seiten bei Umzug auf eine neue Domain (Navigationsstruktur bleibt gleich)

Redirect 301 / https://neue-domain.tld

# Redirect aller Seiten bei Umzug auf eine neue Domain (geänderte Navigationsstruktur, daher Weiterleitung auf Startseite)

Redirect 301 / https://neue-domain.tld/startseite.html

# Redirect innerhalb der gleichen Domain

RewriteEngine On
RewriteRule ^faq/cms\-made\-simple\.htm$ /webdesign/cms-made-simple-tipps-und-tricks/ [R=301,L]

Mit den Zeichen ^ und $ wird der Anfang und das Ende der umzuleitenden Seite gekennzeichnet. Der Punkt . steht in regulären Ausdrücken für ein beliebiges Zeichen, wenn wir wirklich einen Punkt meinen, dann wird dies mit einem Backslash \ gekennzeichnet (\ bedeutet also: exakt das nächste Zeichen).

2.3 Domain auf verschlüsselte Verbindung umleiten

Um zu erzwingen, dass alle Seiten einer Domain ausschliesslich nur über eine SSL-Verbindung aufgerufen werden können, so kann dies über einen Eintrag in der .htaccess Datei umgesetzt werden:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

In der ersten Zeile wird mit «RewriteCond» die Bedingung definiert «Wenn der Aufruf nicht auf Port 443 erfolgt» (Port 443 wird für SSL-Verschlüsselung verwendet, Port 80 für unverschlüsselte Aufrufe).
In der zweiten Zeile ist die Regel für das Umschreiben der URL definiert. Trifft die Bedigung in der ersten Zeile zu, so wird der Aufruf einer beliebigen URL auf die gleiche Domain (${HTTP_HOST}), jedoch mittels https:// umgeleitet. Das /$1 fügt die ursprüngliche URL ein.
Der Parameter [L] definiert, dass nach dem Umschreiben der URL keine weiteren Regeln ausgeführt werden. Somit werden alle Zeilen weiter unten in der .htaccess Datei ignoriert.
Das R=301 setzt für den Redirect den Status permanent.

2.4 Der Domain immer ein www vorne anstellen

Wird die Domain ohne www aufgerufen, wir hier auf www.domain.ch weitergeleitet:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.tld$ [NC]
RewriteRule ^(.*)$ http://www.domain.tld/$1 [R=301,L]

2.5 Domain ohne www aufrufen

Soll die Domain nur ohne www aufgerufen werden, kann ein Aufruf mit www so abgefangen werden:

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

Die Weiterleitung nach https://domain.tld erfolgt dabei mit dem Statuscode 301 (permanent).

Für die Weiterleitung einer beliebigen Subdomain welche mit www aufgerufen wird, schreibt man folgendes:

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

2.6 Redirect für sprechende URLs

Mit der Rewrite Engine können auch sprechende URLs für CMS Systeme umgesetzt werden. Bei WordPress sieht das z.B. so aus:

<IfModule mod_rewrite.c>
   RewriteEngine On 
   RewriteBase / 
 
   RewriteRule ^index.php$ - [L] 
   RewriteCond %{REQUEST_FILENAME} !-f 
   RewriteCond %{REQUEST_FILENAME} !-d 
   RewriteRule . /index.php [L] 
</IfModule>

Das <IfModule> fragt erst ab, ob das Apache Module mod_rewrite überhaupt existiert, so dass keine Fehlermeldung ausgegeben wird, falls der Redirect Code nicht interpretiert werden kann.
Das «RewriteBase /» setzt als Basis für das Redirect den Root Ordner. Es kann aber auch ein Unterordner gesetzt werden, wenn das CMS in einem Unterordner der Domain installiert ist.

2.7 Redirect auf einen Unterordner

Sollen die Dateien aus einem Unterordner, in welchem z.B. ein CMS installiert ist, direkt auf der Hauptebene angezeigt werden, so kann dazu folgendes ReWrite eingerichtet werden:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?domain.ch$
RewriteCond %{REQUEST_URI} !^/unterordner/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /unterordner/$1
RewriteCond %{HTTP_HOST} ^(www.)?domain.ch$
RewriteRule ^(/)?$ unterordner/index.php [L]

3. Die Verwendung von .htaccess zum Passwortschutz eines Verzeichnisses

Der Apache Webserver besitzt eine zentrale Konfigurationsdatei (acess.conf), in welcher die Eigenschaften, Dienste, Zugriffsrechte usw. des Webserver zentral beschrieben sind. Bei mehreren Benutzern mit unterschiedlichen Einstellungen kann der Server zusätzlich auch dezentral konfiguriert werden. Diese Einstellungen werden bei allen kompatiblen NCSA (National Center for Supercomputing Applications) Webservern in einer Textdatei mit dem Namen .htaccess gemacht.

Nach der Grundeinstellung (default) des Apache Servers sind alle http-Verzeichnisse für jedermann mit Leseberechtigung zugänglich. Damit die ganze Homepage oder Teile davon geschätzt werden können, braucht es eine .htaccess Datei. Die .htaccess Datei spezifiziert nur den Umfang des Schutzes, die Passwöter selbst sind in dieser Datei nicht enthalten. Diese sind in einer separaten Datei mit dem Namen htpasswd gespeichert. Die .htaccess Datei kann noch weitere Konfigurationsdaten beinhalten, diese können Sie weiter unten auf der Seite nachlesen.

Es braucht insgesamt 4 Linien in der .htaccess Datei für die Erstellung eines Passwort Schutzes. Die Daten, die Sie angleichen müssen, sind blau markiert:

3.1 Beispiel einer .htaccess Datei

AuthName "Geheimbereich"AuthType BasicAuthUserFile /home/blattertech/html_auth/.htpasswdrequire valid-user

AuthType Basic ist das Schutzverfahren. Es ist nur Basic ist möglich. AuthName «Geheimbereich» definiert den Namen des Geheimbereichs. AuthUserFile definiert den Pfad zur .htpasswd Datei. Er muss immer vom Homedir, meistens /home/ her definiert sein. require valid-user fordert einen gültigen Benutzer.

Tipps:

  • Die .htaccess Datei schützt ohne weitere Angaben alle Seiten des entsprechenden Verzeichnisses und dessen Unterverzeichnisse.
  • Die htpasswd Datei sollte sich nicht im gleichen Verzeichnis wie die .htaccess Datei befinden. Wenn möglich sollte sie in einem dem Internet nicht zugänglichen Ordner abgelegt werden, z.B. dem Homedir, oder falls vorhanden, im html_auth Ordner.
  • Es kann sein, dass die htpasswd Datei auch «users» heissen muss. Da fragen Sie am besten bei Ihrem Hostingprovider nach.

Wenn ein Besucher die URL des geschützen Bereichs anzusprechen versucht, sendet der Webserver zunächst eine Aufforderung zur Authentifizierung an den Client. Der Browser zeigt dann dem Besucher eine Dialogbox mit Eingabefeldern für die Benutzererkennung und das Kennwort an, in der auch die Beschreibung des geschützten Bereichs angezeigt wird. So weiss der Besucher für was er sich gerade ausweisen soll. Weist sich der Besucher gemäss der definierten Berechtigung korrekt aus, dann darf er auf das Dokument zugreifen, anderenfalls löst der Webserver einen HTTP-Fehler 403 aus.

4. Die htpasswd Datei

Das Format dieser Datei ist sehr einfach aufgebaut. Es besteht aus einer Serie von Benutzernamen und Passwörter. Jede Zeile enthält einen Benutzernamen und ein dazugehöriges Passwort. Die beiden Wörter werden mit einem Doppelpunkt getrennt. Die .htpasswd Datei enhält aus Sicherheitsgründen nur das codierte Passwort. Das Passwort wird NIE im Klartext angezeigt. Die Verschlüsselung wird mit der Unix Systemroutine crypt() ausgeführt.

4.1 Beispiel einer htpasswd Datei

martin:YlfYyU1.N0Tpcmirjam:grXgv9Sj880sswebmaster:lIPnZv3usHD6E

Die Datei htpasswd sollte im ASCII modus übertragen werden, damit es keine Probleme mit dem Lesen der Daten gibt.

5. Die Verwendung von .htaccess zum Passwortschutz einer Datei

Möglicherweise möchten Sie nur eine einzige Datei in einem Verzeichnis schützen. Um dies zu tun, erstellen Sie wiederum eine .htaccess Datei im gleichen Verzeichnis wie die zu schützende Datei.

5.1 Beispiel einer Datei zum Schutz der Datei beispiel.php

Die Daten, die Sie angleichen müssen, sind blau markiert:

AuthType BasicAuthName "Geheimbreich"AuthUserFile /home/blattertech/html_auth/.htpasswdrequire valid-userAllow From All<Files beispiel.php>Deny From All</Files>

AuthType Basic ist das Schutzverfahren. Es ist nur Basic möglich. AuthName «Geheimbereich» definiert den Namen des Geheimbereichs. AuthUserFile definiert den Pfad zur .htpasswd Datei. Er muss immer vom Homedir, meistens /home/ her definiert sein. require valid-user fordert einen gültigen Benutzer. Allow From All erlaubt den Zugriff auf alle Dateien des Ordners. <Files beispiel.php>Deny From All</Files> untersagt den allgemeinen Zugriff auf die Datei beispiel.php

6. Ausgabe von Errorseiten

Im HTTP-Standard sind verschiedene Fehlermeldungen spezifiziert. Wenn ein Fehler auftritt, sendet der Webserver den Fehlercode zusammen mit einer Fehlermeldung an den Client (Browser). Diese Fehlermeldung kann eine HTML Seite oder ein Plaintext sein, der erklärt, was für ein Fehler aufgetreten ist. Diese Seiten werden normalerweise automatisch vom Webserver ausgegeben. Durch die .htaccess Datei kann man sie jedoch beeinflussen. Folgende Fehlercodes gibt es:

Error 400 bad_request
Der Browser (oder Proxy) hat eine ungültige Anfrage gesendet, die vom Server nicht beantwortet werden kann.

Error 401 auth_required
Der Server kann nicht verifizieren ob, der User authorisiert ist, auf eine bestimmt URL zuzugreifen. Dabei kann ein falsches Passwort eingegeben worden sein oder der Browser kann die geforderten Referenzen nicht übermitteln

Error 403 forbidden
Der Webserver verweigert den Zugriff auf das angeforderte Verzeichnis. Entweder ist der Zugriff auf die Verzeichnisstruktur nicht erlaubt oder das Verzeichnis ist zugriffsgeschätzt.

Error 404 not_found
Die angeforderte Datei ist nicht vorhanden

Error 408 request_timeout
Nach einer gewissen Zeit, ohne das auf eine Anfrage eine Antwort geliefert werden konnte, schliesst der Webserver die Verbindung

Error 500 internal_server_error
Die Proxy-Anfrage kann nicht ausgeführt werden. Es ist im Server ein interner Fehler aufgetreten. Der Server ist entweder überlastet oder ein Fehler in einem CGI-Script ist aufgetreten.

Weitere Errors sind:

Error 412 precondition_failed
Error 413 entity_too_large
Error 414 uri_too_large
Error 415 unsupported_media_type
Error 501 not_implemented
Error 502 bad_gateway
Error 503 service_unavailable
Error 506 variant_also_varies

6.1 Beispiel einer .htaccess Datei

Plain Text

ErrorDocument 404 "Die Angeforderte Datei ist nicht vorhanden.

Beim Plain Text wird die Fehlermeldung als ASCII Text an den Client gesendet. Das nicht zwei » vorhanden sind ist kein Schreibfehler

lokale Weiterleitung

ErrorDocument 404 /errors/404.html

Hier wird eine lokale Fehlerseie angezeigt. Hier darf kein relativer Pfad eingesetzt werden, sondern nur der Pfad vom ‹public_html› Verzeichnis.

externe Weiterleitung

ErrorDocument 404 http://www.blattertech.ch/errors/404.html

Hier wird die URL zu einem anderen Server eingetragen.

7. Caching

7.1 Caching aktivieren

Caching für Bilddateien aktivieren

# CACHE images 30 days
<IfModule mod_headers.c>
     <FilesMatch "\.(gif|ico|jpeg|jpg|png|css|js)$">
           Header set Cache-Control "max-age=604800, public"
     </FilesMatch>
</IfModule>

# Cache Expiration 
<IfModule mod_expires.c>
    ExpiresActive On ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/html "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType text/x-javascript "access plus 1 month"
    ExpiresByType application/x-shockwave-flash "access plus 1 month"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresDefault "access plus 1 month"
</IfModule>

7.2 Caching deaktiveren

Soll keine Datei im Browser Cache abgelegt werden, so kann dies mit folgender Einstellung unterbunden werden:

# Disable cache global
<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

# Disable cache for defined file extensions
<FilesMatch "\.(css|flv|gif|htm|html|ico|jpe|jpeg|jpg|js|mp3|mp4|png|pdf|swf|txt)$">
    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>
    <IfModule mod_headers.c>
        FileETag None
        Header unset ETag
        Header unset Pragma
        Header unset Cache-Control
        Header unset Last-Modified
        Header set Pragma "no-cache"
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
    </IfModule>
</FilesMatch>

8. Testing von .htaccess

Um eine .htaccess zu testen gibt es diverse Seiten, welche einen .htaccess-Tester anbieten. Dies ist praktisch, wenn z.B. Redirect Regeln geprüft werden sollen. Hier einige mögliche Seiten zum testen: