Tutorials - Apache unter Windows Teil 2
Folgende Fragen werden hier erklärt:
- Verzeichnisse schützen
- Error-Meldungen anpassen (.htaccess)
- Übersicht über die Fehlercodes
- Error-Meldungen anpassen (httpd.conf)
- Jeden Tag eine neue Log-Datei
Verzeichnisse schützen
Auf vielen Webseiten hast Du es schon gesehen: Es gibt einen Bereich, bei dem ein Name und Kennwort angefordert wird, wenn man auf ihn zugreifen möchte. Dieser Bereich steht nur den Leuten zur Verfügung, die die Zugangscodes haben. So ist es möglich, bestimmte Inhalte einer Seite nur einer bestimmten Benutzergruppe zugänglich zu machen, oder aber für sich selber einen Admin-Bereich einzurichten, auf den man nur selber Zugriff hat, und wo man Dateien liegen hat, die man zur Pflege der Seiten oder des Servers braucht, etc. Hier möchte ich Dir erklären, wie das funktioniert:
Die Authentifizierung mittels Passwort erfolgt so:
Der Client (unser Browser) sendet den Namen und das Passwort an
den Apache Webserver. Dieser sieht in einer speziellen Datei nach,
ob der Client zugriffsberechtigt ist oder nicht.
Es ist möglich eine ganze Reihe von Personen in Gruppen zusammenzufassen
und diesen Gruppen als Ganzes den Zugang zu erlauben oder zu verbieten.
Die Authentifizierungsdatei wird mit einem kleinen Programm erstellt,
welches sowohl bei der UNIX/Linux- als auch der Windows-Version
des Apache mitgeliefert wird.
Dieses Programm heißt "htpasswd" und findet sich
im "bin" Verzeichnis von Apache. Es arbeitet kommandozeilenorientiert.
Was heisst das für uns? Wir sollten schon mal mit der DOS-Konsole
gearbeitet haben, dann fällt es uns zumindest etwas leichter.
Dieses Beispiel geht davon aus, daß ein Ordner "F:\Web"
existiert, in dem unsere Homepage-Dateien liegen. In diesem Ordner
F:\Web soll nun ein Verzeichnis "Privat" eingerichtet
werden. In diesem Verzeichnis soll eine "privat.html"
liegen. Wenn diese aufgerufen wird, soll eine Passwortabfrage erfolgen.
Funktionsweise
Die .htaccess-Datei wird bei jedem Zugriff auf ein Verzeichnis oder
eine Datei im und unterhalb des Verzeichnisses der .htaccess-Datei
gelesen und ausgewertet. Wird z.B. von einem Nutzer die Datei "geheim.htm"
im Verzeichnis "\Privat" abgefragt, so schaut der Webserver
erst in allen höher gelegenen und im Verzeichnis "\Privat"
nach einer vorhandenen .htaccess-Datei.
.htaccess erstellen
Zuerst musst Du diese .htaccess-Datei erstellen. Am besten
erstellst Du mit dem Windows-Editor eine ".htaccess.txt"-Datei.
In diese schreibst Du folgendes:
AuthType Basic
AuthName "Privater Bereich"
AuthUserFile c:/apache/cgi-bin/.htpasswd
require valid-user
Was bedeutet das?
AuthType
Der üblicherweise verwendete Authorisierungstyp ist
Basic; andere mögliche Typen sind z.b. PGP oder Kerberos, diese
werden aber z.B. vom Apache-Server nicht unterstützt. In der
vorliegenden Beschreibung wird nur auf Basic eingegangen, dieser
Typ benutzt als Paßwortdatei eine weitere Textdatei.
AuthName
Kurze Beschreibung des geschützten Web-Bereichs. Diese
Beschreibung wird dem Anwender angezeigt, bevor Username und Password
abgefragt werden.
AuthUserFile
Dateibezeichnung und Speicherort der Paßwortdatei.
In dieser Datei werden die angelegten Benutzernamen nebst Kennwörtern
gespeichert.
require
Mit der require-Directive wird angegeben, nach welchem
Kriterium Benutzer zugelassen werden sollen. Es gibt hier drei alternative
Möglichkeiten :
- require user user1 user2 ...
Gibt den Bereich gezielt nur den aufgelisteten Benutzern user1, user2 usw. frei. Diese Alternative erfordert einen hohen Pflegeaufwand. - require valid-user
Gibt den Bereich für alle in der Paßwortdatei definierten Benutzer frei. Dies ist die am häufigsten verwendete Form, sie ist im Allgemeinen die Alternative, die sich am einfachsten pflegen läßt. - require group group1 group2 ...
Es dürfen Benutzer zugreifen, die einer der aufgeführten Gruppen group1, group2 usw. angehören. Diese Variante bietet sich an, wenn man verschiedene Bereiche mit unterschiedlichen Zugriffsrechten versehen will, aber nur eine Paßwortdatei pflegen möchte.
Die ".htpasswd"-Datei liegt in diesem Beispiel im "cgi-bin"-Verzeichnis von Apache, aber man kann sie natürlich auch woanders speichern.
Warum die Datei als ".txt-Datei" speichern?
Wenn Du eine .htaccess-Datei abspeicherst, wird Windows Dir wahrscheinlich
die Meldung "Bitte geben Sie einen Dateinamen ein" anzeigen.
Deshalb die ".txt"-Endung. Diese Datei speicherst Du im
zu schützenden Verzeichnis ab, also in "F:\Web\Privat".
Nun öffne eine DOS-Box und gib folgendes ein:
cd\ ---> wechselt auf Laufwerk "C:/"
cd apache\bin ---> wechselt in's "bin-Verzeichnis" von Apache
Zuerst benennen wir unsere ".htaccess.txt" in ".htaccess" um. Das machen wir so:
ren f:\web\privat\.htaccess.txt .htaccess
Dann noch einen Benutzer anlegen, der sich in dem geschützten Bereich einloggen darf:
htpasswd -c c:\apache\cgi-bin\.htpasswd testuser
Gib danach das Passwort für den Benutzer testuser ein (2x).
Du wirst jetzt unter c:\apache\cgi-bin\.htpasswd eine Passwortdatei
finden, in der der Benutzer "testuser" und sein Passwort
gespeichert sind.
Übrigens: der Schalter "-c" hinter dem Befehl "htpasswd"
bedeutet "create", d.h. eine neue Datei wird angelegt.
Wenn eine Datei schon besteht und zusätzlich ein Benutzer eingetragen
werden soll, muss der Befehl ohne "-c" abgesetzt werden,
also so:
htpasswd c:\apache\cgi-bin\.htpasswd testuser
Ja, das wär's auch schon. Ach ja, allerdings sind wir noch nicht ganz fertig, es muss noch ein Eintrag in der httpd.conf des Apache-Servers geändert werden. Öffne also besagte Datei im Editor und suche nach".htaccess". Du wirst zu solch einer Stelle kommen:
------------- Ausschnitt aus der httpd.conf --------------------
# This controls which options the .htaccess files in directories
can
# override. Can also be "All", or any combination of "Options",
"FileInfo",
# "AuthConfig", and "Limit"
#
AllowOverride None ----> Das änderst
Du ab in AllowOverride All
----------------------------------------------------------------
Erst durch Änderung dieser Zeile wird der Passwortschutz aktiv.
Die httpd.conf speichern und - ganz wichtig - den Server wie immer
nach Änderungen an der httpd.conf neu starten, sonst kann der
Test schiefgehen.
Dann kannst Du den Test starten ob es auch wirklich klappt mit dem
Verzeichnisschutz.
Testen des Verzeichnisschutzes
Was passiert, wenn Du nun im Browser versuchst, auf die geschützte Zone zuzugreifen? Versuch' es mal! Setze in der Adressleiste des Browsers folgende Adresse ab:
http://localhost/privat
Siehe da: eine Eingabeaufforderung geht auf, mit der Bitte, Username und Passwort einzugeben.
Wenn Du nun bei Benutzername "testuser"
und bei Passwort Dein vergebenes Passwort eingibst, wirst Du auf
die "privat.html" oder wie immer Du die Datei genannt
hast, weitergeleitet.
Wenn Du jedoch auf "Abbrechen" klickst, wirst Du wohl
so eine Meldung sehen:
Du bekommst eine sogenannte "401" -Fehlermeldung, die da sagt, daß Du nicht berechtigt bist, den gewünschten Inhalt angezeigt zu bekommen. Wie Du diese Fehlermeldung Deinen Wünschen anpassen kannst, soll das folgende Kapitel zeigen.
Fehlermeldungen anpassen (.htaccess)
Toll, Du hast Dich bis
hierher durchgekämpft und bei Dir läuft der Apache? Gut,
dann ist es an der Zeit zu erfahren, wie man dem Betrachter Deiner
Seiten angepasste "Error-Documents" serviert. Jedem kann
mal ein Fehler passieren, und gerade beim Verlinken von Webseiten
schleichen sich diese manchmal ein. Dann ist es doch schöner,
dem Betrachter eine angepasste Fehlerseite zu zeigen, mit einem
Link der ihn zurück auf Deine Seiten führt, anstatt ihn
einfach mit einer Apache-Standardmeldung im Regen stehen zu lassen.
Schauen wir doch mal, was man im Fall der oben gezeigten Meldung
machen kann. Eine Information vorweg: Es muss ein Eintrag in der
.htaccess-Datei vorgenommen werden. Schauen wir mal, was da geht:
Erstmal erstellen wir ein angepasstes Fehlerdokument: Erstelle eine
HTML-Datei mit folgendem Inhalt:
<html>
<head>
<title>401-Error</title>
</head>
<body>
<p>401-Fehler: Es wurde kein Zugriff auf die angeforderte
Seite gewaehrt.</p>
<p>Zurueck zur <a href="http://xyz.dyndns.org"
target="_self">Startseite</a>
oder zur <a href=javascript:history.back()>vorherigen Seite</a></p>
</body>
</html>
Diese Datei dient nur zu Testzwecken und kann natürlich nachher beliebig angepasst werden. Erstelle im Root-Verzeichnis Deines Webservers, (hier F:\Web) einen Ordner namens "error". In diesen speichere die Datei als "401.html" ab. Das hat den Vortei, daß Du sofort eine gewisse Ordnung in Deinen Dokumenten hast, und in diesen Ordner alle angepassten Dateien speichern kannst. Nun musst Du nur noch deinem Server sagen, daß er diese Seite im Falle eines 401-Fehlers anzeigen soll. Öffne also die .htaccess-Datei und trage folgendes als letzte Zeile ein:
ErrorDocument 401 /error/401.html ---> das ist die sog. lokale Weiterleitung
Hierbei wird eine lokale Fehlerseite angezeigt. Es darf kein relativer Pfad eingesetzt werden, sondern nur der Pfad vom 'public_html' Verzeichnis. Speichere die Datei und schliesse sie.
Folgende Einträge in die .htaccess wären noch möglich:
ErrorDocument 401 http://andere-url.de/401.html ---> das ist die sog. externe Weiterleitung
Hier wird die URL zu einem anderen Server eingetragen.
ErrorDocument 401 "Zugang nicht gewaehrt." ---> das ist der sog. Plain Text
Beim Plain Text wird die Fehlermeldung als ASCII Text an den Client gesendet.
Testen der angepassten Fehlerseite
Diesmal brauchst Du den Server nicht neu starten, denn Du hast ja nicht die "httpd.conf" editiert, sondern nur die ".htaccess".
Zum Testen brauchst Du nur im Browser eingeben:
http://localhost/privat
Dann im Fenster auf "Abbrechen" klicken, und die selbst
erstellte Seite sollte angezeigt werden. Gut, nicht ?
Das kannst Du natürlich auch für andere Fehlermeldungen
machen. Aber erst einmal: Was sind die gängigen Fehlermeldungen?
Übersicht über die Fehlercodes
Hier eine Übersicht über die gängigen Fehlermeldungen:
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 (nicht so häufige) Fehler 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
Fehlermeldung anpassen (httpd.conf)
Es gibt noch einen anderen Weg, um dem Server zu sagen, wo die Error-Dokumente liegen, die er im Falle eines Fehlers anzeigen soll. Und zwar - wen wird's wundern - in der httpd.conf. Öffne also Deine httpd.conf wieder im Editor und suche nach "error response" Du kommst zu dieser Stelle:
--------- Ausschnitt aus der httpd.conf -------------
#
# Customizable error response (Apache style)
# these come in three flavors
#
# 1) plain text
#ErrorDocument 500 "The server made a boo boo.
# n.b. the single leading (") marks it as text, it does not
get output
#
# 2) local redirects
#ErrorDocument 404 /missing.html
# to redirect to local URL /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# N.B.: You can redirect to a script or a document using server-side-includes.
#
# 3) external redirects
#ErrorDocument 402 http://some.other-server.com/subscription_info.html
# N.B.: Many of the environment variables associated with the original
# request will *not* be available to such a script.
#
# Customize behaviour based on the browser
#
-----------------------------------------------------
Du weisst bestimmt schon selber, was nun zu tun ist: Erstelle ein html-Dokument für eine 404-Fehlermeldung (Pfad oder Datei nicht gefunden) und speichere sie wieder im Ordner "error" ab, diesmal als "404.html". Dann fügst Du in dem oben gezeigten Abschnitt unter "local redirects" die Zeile ein:
ErrorDocument 404 /error/404.html
Dann die Datei speichern, und das Ergebnis wieder testen, allerdings muss der Server diesmal neu gestartet werden. Das Ganze testest Du, indem Du eine Adresse angibst, die auf Deinem Server nicht vorhanden ist, also z.B. "http://localhost/test.html". Du bekommst nun Deine spezielle Fehler-Seite angezeigt.
Jeden Tag eine neue Logdatei
Hinweis: Dieses Kapitel baut auf den Informationen aus den Kapiteln "Apache Allgemein-
Die Logfiles des Apache" auf.
Wie Du Dir vorstellen
kannst, wird die "access.log" im Laufe der Zeit recht
groß. Wäre es nicht sinnvoll, aus diesem Grund jeden
Tag eine Loddatei anlegen zu lassen, die dann auch mit dem Datum
des jeweiligen Tages versehen wäre? Ich finde schon, deshalb
erkläre ich's schnell. Zu diesem Zweck soll allerdings nicht
auf Apache-Bordmittel zurückgegriffen werden, sondern wir werden
uns ein Programm besorgen, welches für unsere Zwecke gut geeignet
ist. Das Programm nennt sich "Cronolog" und findet sich
hier:http://www.cronolog.org/download/cronolog-1.6.1-win32.zip
Auf www.cronolog.org
befindet sich ferner die Dokumentation des Programms. Wenn Du die
Datei heruntergeladen hast, entpacke die "Cronolog.exe"
nach "C:\Apache\bin". Das ist standardmäßig
der Ordner, in dem Dateien abgelegt werden, die der Erweiterung
des Servers dienen. Dieser Ordner sollte Dir schon bekannt vorkommen
wenn Du die vorherigen Kapitel gelesen hast, denn unsere "htpasswd.exe"
liegt ja auch dort.
Jedoch zurück zu unserem Anliegen: Die Datei "Cronolog.exe"
liegt also im "bin-Odner" des Apache-Servers. Nun ist
-Du wirst es schon ahnen- die httpd.conf zu editieren, denn wir
müssen ja unserem Server noch mitteilen, daß er mit Hilfe
der Cronolog.exe die access.log-Datei jeden Tag neu anlegen soll.
In die httpd.conf ist folgendes einzutragen:
CustomLog logs/access.log common <--- Diesen Eintrag auskommentieren
Hinzufügen:
Transferlog "|c:/apache/bin/cronolog.exe c:/apache/logs/access%Y%m%d.log"
Das wär's soweit schon. Nun hast Du jeden Tag eine neue access.log, z.B. namens "access20010916.log" (16.09.2001). Für Änderungen oder Anpassungen solltest Du einen Blick auf die Cronolog-Webseite werfen, auf der alles ausführlich dokumentiert ist.