Webserver Apache
Willemers Informatik-Ecke


Bei Amazon bestellen


Ferien an der Flensburger Förde
2016-11-07
Linux is like a wigwam. No Gates no Windows but always an apache inside

Zitat unbekannter Herkunft

Hypertext Transfer Protocol

Ein Webserver ist ein Prozess der Anfragen nach dem Protokoll HTTP beantwortet. Das Programmpaket apache ist ein Open Source Projekt und gilt als der meistverwendete WWW-Server im Internet.

HTTP ist die Abkürzung von Hypertext Transfer Protocol und ist in der RFC 1945 definiert.

Den passenden Client nennt man Browser, die bekanntesten sind Firefox, Chromium, Safari und der Microsoft Internet Explorer.

Hypertext und HTML

Hypertext und Verweise

Hypertext ist ein Text mit aktiven Verweisstellen auf andere Texte. Im Web werden sie Links genannt. So ist es möglich, Texte zu schreiben, die eine Materie auf hohem Niveau behandeln. Anfänger können durch die Verweise auf die erforderlichen Erläuterungen und Definitionen geführt werden, während der Experte seine Informationen komprimiert erhält. Hypertexte eignet sich auch ideal, um Informationen abzulegen, die stark miteinander verknüpft ist.

HTML und Tags

Die Sprache HTML (Hypertext Markup Language) ist sehr einfach zu lernen. Für die Beispiele werden hier einige ausgewählte Grundlagen vorgestellt. HTML-Dateien können mit einem einfachen Editor erstellt werden und haben neben dem eigentlichen Text Darstellungsbefehle, die Tag (engl. Etikett) genannt werden. Ein Tag ist in spitzen Klammern eingeschlossen. In den meisten Fällen gilt ein Tag für einen Bereich. Der Geltungsbereich wird durch das Ende-Tag begrenzt, dass man daran erkennt, dass ein Schrägstrich hinter der geöffneten, spitzen Klammer steht. Die Startseite einer Präsenz heißt normalerweise index.html oder index.htm. Sie hat folgenden Inhalt:

<HTML>
<HEAD>
</HEAD>
<BODY>
<H1>Große Überschrift</H1>

Schauen Sie sich diesen <A HREF="quatsch.html">Quatsch</A> an.

</BODY> </HTML>

HTML, HEAD, BODY, Hx und A

Die Tags HTML und BODY rahmen den Körper einer Webseite ein. Der Abschnitt HEAD ist für Informationen, die beispielsweise Suchmaschinen auswerten und auch der Titel der Webseite. H1 ist eine Überschrift (engl. header). Es gibt noch H2, H3, H4 und H5, die immer kleiner werdende Überschriften erzeugen. Das Tag A dient der Adressierung und besitzt Attribute. Mit HREF (Hyperreferenz) wird auf die angegebene Datei, hier quatsch.html verwiesen. Der Text der zwischen <A> und </A> wird bei der Darstellung durch den Browser unterstrichen und blau dargestellt, als Zeichen, dass man durch einen Klick hierauf an eine andere Stelle springt. In diesem Fall führt es zum Laden der Datei quatsch.html auf dem gleichen Server.

Es wird die Seite quatsch.html, die ja von index.html angesprungen wird, benötigt. Sie sieht nicht viel anders aus.

<HTML>
<BODY>
<H1>Großer Quatsch</H1>

<H4>Kleiner Quatsch</H4>

Und hier geht es <A HREF="index.html">zur Hauptseite</A>.

</BODY> </HTML>

Gestaltungselemente

Absatz und Umbruch

Aller Text wird vom Browser hintereinander geschrieben. Um einen Absatz zu erzeugen, wird das Tag <P> eingefügt. Soll nur einen Zeilenumbruch ohne Abstand erreicht werden, verwendet man <BR>.

Tabelle

Eine in HTML geschriebene Tabelle sieht auf den ersten Blick etwas kompliziert aus. Das liegt daran, dass sie gleich drei Tags verwendet. Das erste ist TABLE, das die gesamte Tabelle umschließt. TR umschließt die Tabellenzeile und TD eine Spalte innerhalb der Zeile. Der Browser übernimmt das korrekte Ausrichten. Man braucht also keine Gedanken darauf verschwenden, welchen Platz eine Spalte braucht. Das folgende Beispiel erzeugt eine Tabelle, die noch einmal die Tags beschreibt:

<TABLE BORDER>
<TR><TD> table </TD><TD> Die ganze Tabelle </TD></TR>
<TR><TD> tr    </TD><TD> Eine Spalte       </TD></TR>
<TR><TD> td    </TD><TD> Ein Feld          </TD></TR>
</TABLE>

Positionierung per Tabelle

Das Attribut BORDER versieht die Tabelle mit einem Rahmen. Auch ohne Rahmen machen Tabellen Sinn. Man benötigt sie, um Texte nebeneinander zu positionieren. Durch das Verschachteln mehrerer Tabellen können auch kompliziertere Anordnungen realisiert werden.

Formulare

Benutzereingaben

Zur Erstellung von Eingabemasken und Kontrollelementen wird in HTML ein Formular verwendet. Der Inhalt des Formulars wird entweder auf dem Server selbst verarbeitet oder kann per E-Mail versandt werden. Die Verarbeitung der Formularinhalte wird später noch einmal beim Thema CGI auftauchen.

Formular-Rahmen

Jedes Formular wird unsichtbar durch das Tag FORM eingerahmt. Im Starttag wird Aktion und Versendungsmethode festgelegt.

<FORM ACTION="mailto:informatik-ecke@willemer.de" METHOD=post>
...
</FORM>

Dies ist ein typisches Beispiel für das Versenden des Formularinhaltes per E-Mail. Der Browser wird versuchen, den Formularinhalt an die genannte E-Mail Adresse zu senden.

<FORM ACTION="/cgi-bin/tuwas" METHOD=get>
...
</FORM>

Der Inhalt dieses Formulars wird von dem Programm tuwas verarbeitet. Dieses muss sich auf dem Server in dem für CGIs definierten Verzeichnis befinden.

Die Bedeutung der Attribute sind:

action=
Hier wird der Name des Programmes auf dem Server angegeben, das das Formularergebnis bearbeitet. Ausnahme ist die Anweisung mailto, die den Inhalt an eine Adresse versenden lässt. In diesem Fall sollte die Methode POST verwendet werden.
method=get
Die Daten werden in der Environmentvariable QUERY_STRING abgelegt. Das CGI-Programm liest diese Variable aus.

method=post
Die Daten werden per Standardeingabe an das CGI Programm geliefert. Die Environmentvariable CONTENT_LENGTH enthält die Länge der Eingabe.

Eingabe- und Kontrollelemente

Ein Formular wird erst durch die Bestückung mit Kontrollelementen lebendig. Ein Kontrollelement wird mit dem Tag INPUT gekennzeichnet. Mit dem Attribut TYPE wird der Typ gekennzeichnet werden. An dieser Stelle sollen nur zwei Elementetypen betrachtet werden. Das eine ist das SUBMIT. Es ist der Bestätigungsknopf, der in jedem Fomular dafür sorgt, dass die Eingaben abgeschickt werden. Das andere ist TEXT, das die Eingabe von Text ermöglicht. Mit dem Attribut VALUE kann die Vorbelegung des Eingabeelements erfolgen. Ganz wichtig ist das Attribut NAME, an dem man bei der Auswertung die einzelnen Kontrollelemente erkennen kann. Also müssen die Namen für das jeweilige Formular eindeutig sein.

SUBMIT

Jedes Formular enthält normalerweise einen Button zum Absenden des Formularinhalts an das CGI-Programm oder die E-Mail. Dieser Button ist vom Typ SUBMIT. Erst wenn der Betrachter diesen Knopf betätigt, wird die ACTION des Formulars aktiv.

<form>
<input type=submit value="OK">
</form>

Texteingabefeld TEXT

Mit dem Kontrollelementtyp TEXT können Textzeilen eingegeben werden. Beispiel:

<FORM>
Welches Auto fahren Sie? 
<INPUT TYPE=TEXT NAME="auto" VALUE="Alt aber bezahlt"
 SIZE=20 MAXLENGTH=60>
<TEXTAREA Name="Adresse" ROWS=5 COLS=60>
Ihre Adresse
</TEXTAREA>
</FORM>

TEXTAREA

Eine Abart des TEXT ist die TEXTAREA, die mehrere Zeilen Text aufnehmen kann. Man könnte auch von einem simplen Editor reden. Er wird mit dem Tag TEXTAREA eingeleitet. Der folgende Text bis zum Endetag ist die Vorbelegung des Kontrollelements, ähnlich wie bei VALUE=.

RADIO

Ein zusammengesetztes Element ist der Radiobutton. Es werden mehrere >>Knöpfe<< unter gleichem Namen definiert. Nur einer von ihnen kann angewählt werden. Die folgende Definition bildet realistisch die möglichen Eigenarten von Menschen ab.

<INPUT TYPE="RADIO" NAME="eigenschaft" VALUE="intelligent">
<INPUT TYPE="RADIO" NAME="eigenschaft" VALUE="sportlich">
<INPUT TYPE="RADIO" NAME="eigenschaft" VALUE="schön">

Wer nähere und aktuelle Informationen zum Thema HTML braucht, sollte sich mit SelfHTML beschäftigen. Es findet sich bei vielen Linuxdistributionen anbei oder im Internet unter der URL http:/de.selfhtml.org

Start des Servers

Das Startskript für den Apachen findet man im Verzeichnis /etc/init.d unter dem Namen apache2. Für den Start wird es mit dem Argument start aufgerufen. Um den Server zu stoppen, muss das Argument stop heißen. Das Argument restart stoppt und startet den Apachen neu. Und mit dem Argument reload fordert man ihn auf, seine Konfiguration neu zu lesen, ohne deshalb den Betrieb zu unterbrechen.

# /etc/init.d/apache2 start

Erster Test

Sobald der Server gestartet ist, können erste Seiten mit einem Browser abgerufen werden. Dazu starten Sie einen Browser und geben in die Adresszeile http://localhost ein. Sie können den Server auch von einem anderen Computer im gleichen Netzwerk ansprechen, indem Sie hinter http:// den Rechnernamen des Servers oder dessen IP-Nummer setzen.

Die Datei index.html im Verzeichnis /var/www/html enthält den HTML-Code, der im Browser zu sehen ist. Sie können ihn anpassen, um ihren eigenen Inhalt zu publizieren.

Die Konfigurationsdateien

In alten Versionen des Apachen gab es eine einzige Konfigurationsdatei namens httpd.conf. Diese Datei wurde langsam unübersichtlich und wurde darum in die Kategorien sites, mod und conf unterteilt. Da es immer wieder vorkommt, dass Konfigurationen kurzzeitig vom Netz genommen werden müssen, um später wieder aktiviert zu werden, unterscheidet man zwischen verfügbaren (available) und aktiven (enabled) Konfigurationen. Alle Konfigurationsdateien müssen seit Apache 2.4 die Endung .conf tragen.

Die Konfiguration einer Website

Im Verzeichnis /etc/apache2/sites-enabled finden Sie direkt nach der Installation eine Datei namens 000-default.conf. Diese hat folgenden Inhalt:
<VirtualHost *:80>
        #ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
In Ihrer Datei werden Sie noch einige Zeilen finden, die mit einem # als Kommentare gekennzeichnet sind und darum vom Webserver nicht gelesen werden.

Die Konfiguration wird durch einen Tag VirtualHost eingeklammert. Sie können mehrere solcher virtueller Hosts anlegen. Der Stern bedeutet an dieser Stelle, dass sich die Konfiguration auf jeden beliebigen Host bezieht, der - wie hinter dem Doppelpunkt steht - über den Port 80 angesprochen wird.

Die Direktiven haben folgende Bedeutungen.

ServerName
Hier ist der Name, der nicht zwingend dem Hostname des Rechners entsprechen muss. Hier könnte also auch www.willemer.edu stehen. Allerdings muss der Name durch /etc/hosts oder DNS bekannt sein.
ServerAdmin
Das ist die E-Mailadresse, an die Probleme weitergeleitet werden.
DocumentRoot
Hier stehen die eigentlichen HTML-Dateien. Von außen gesehen ist dies das WWW Rootverzeichnis des Servers.
ErrorLog
Das Verzeichnis, in dem sich die Fehlermeldungen befinden.
CustomLog
Das Verzeichnis, in dem die Zugriffsprotokolle abgelegt werden.

Indexdateien des Verzeichnisses

Die hinter DirectoryIndex stehenden Dateinamen werden automatisch geladen, wenn nur der Verzeichnisname angegeben wird. Dabei werden sie der Reihe nach durchgegangen, bis apache eine Datei diesen Namens findet.

DirectoryIndex index.html index.htm

Directory-Einstellungen

Es können Direktiven auf Verzeichnisse angewandt werden. Damit können Rechte für verschiedene Verzeichnisse unterschiedlich geregelt sein. So ist der Zugriff auf das Dokumentverzeichnis normalerweise offener als der auf die CGI-Skripte. Die Abschnitte werden wie durch Tags eingeklammert, wobei hinter dem Einleitungstag der Name des Verzeichnisses steht.

Zunächst wird das Wurzelverzeichnis des Rechners eingestellt. Die Directory Einträge gelten für alle Unterverzeichnisse, also wirkt dies auf die gesamte Maschine.

<Directory />
    Options -FollowSymLinks +Multiviews
    AllowOverride None
</Directory>

Damit werden die Zugriffe soweit wie möglich eingeschränkt. In den folgenden Abschnitten können dann die Zugriffe für spezielle Bereiche gelockert werden. Interessanter für den Betrieb des Servers sind die Einstellungen des Verzeichnisses, das oben als DocumentRoot eingetragen wurde:

<Directory "/usr/local/httpd/htdocs">
    Options Indexes -FollowSymLinks +Includes MultiViews
    AllowOverride All
    Order allow,deny
    Allow from .willemer.edu
</Directory>

Symbolische Links

Die Option FollowSymLinks ist normalerweise aus Sicherheitsgründen abgeschaltet. Bei eingeschalteter Option können Dateien und Verzeichnisse auch als symbolische Links angelegt werden. Das ist besonders praktisch, wenn man Webseiten erstellt und sie zu Testzwecken in den Serverpfad einbinden will.

Zugriffsrecht

Die Klausel Allow legt fest, wer Zugriff auf den Server hat. Hier steht normalerweise from all. Das bedeutet, dass jeder den Server in Anspruch nehmen darf. In diesem Beispiel ist die Genehmigung auf Rechner eingeschränkt, die der Domäne willemer.edu angehören. Diese Einstellung ist typisch für einen Intranetserver. So können Firmeninterna eingestellt werden, die nicht für die breite Öffentlichkeit gedacht sind. Hinter dem from können stehen:

Angabe Bedeutung
all jeder beliebige Rechner hat Zugriff
.domain.de Alle Rechner der Domäne domain.de
192.168.109.144 Nur ein spezieller Rechner
192.168. Alle Rechner, deren IP mit 192.168.109 beginnen

Parallel gibt es noch eine Direktive Deny from, die genau das Gegenteil bewirkt, nämlich das Ausschließen von Rechnern oder Netzen.

Privatadministration per .htaccess

Einige der Konfigurationen, die normalerweise zentral gemacht werden, kann man auf der Verzeichnisebene in einer eigenen Datei überschreiben. Allerdings muss das in der zentralen Konfiguration erlaubt sein. Normalerweise wird dort zumindest soviel Freiheit gelassen, dass die Systemsicherheit nicht gefährtet ist.

Interessant ist diese Möglichkeit für Kunden von Internetprovidern. Denn die Wahrscheinlichkeit ist hoch, dass dort der Apache im Einsatz ist und diese Rechte offen stehen. Damit stehen auch dem normalen Kunden Administrationsmöglichkeiten offen.

Voraussetzungen in den zentralen Konfigurationsdateien

Mit der Direktive AccessFileName wird in der Datei /etc/apache2/apache2.conf der Name der Datei festgelegt, die die Konfiguration auf Verzeichnisebene steuert. Normalerweise bleibt es bei dem Standard .htaccess. Mit dieser Datei können Direktiven, die normalerweise in der Sektion Directory stehen, in die Datei .htaccess des jeweiligen Verzeichnisses ausgelagert werden.

Allerdings ist die Voraussetzung, dass die Direktive AllowOverride für das Verzeichnis mindestens FileInfo hat. Sollen Zugriffskonfigurationen geändert werden, muss auch das Stichwort AuthConfig genannt sein. Diese findet sich in der Datei mods-available/userdir.conf.

Die Datei .htaccess kann in allen Unterverzeichnissen des Verzeichnisbaums stehen. Unter anderem kann mit der Direktive ErrorDocument festgelegt werden, dass bestimmte Fehler auf ein Dokument umgeleitet wird.

Fehlende Dateien

Besonders interessant ist dabei der Fehler File Not Found (404). Es kann eine HTML-Datei angegeben werden, die in solchen Fehlerfällen angesprungen wird. Auf diese Weise kann man zwar den Fehler nicht verhindern, aber man kann den Besucher vielleicht auf den korrekten Index setzen, damit er sich wieder zurecht findet.

# .htaccess
ErrorDocument 404 /err404.html

Passwortschutz

Ebenfalls mit einer .htaccess-Datei kann erreicht werden, dass Benutzer bestimmte Unterverzeichnisse nur nach Nennung von Benutzerkennung und Passwort zugreifen können. Zunächst ist Voraussetzung, dass in der httpd.conf die Direktive AllowOverride mindestens den Eintrag AuthConfig aufweist. Dann kann in der .htaccess mit mehreren Einträgen die Kennworteingabe vorbereitet werden.

AuthType Basic
AuthName "Meine kleine Sicherung"
AuthUserFile htdocs/arnold/.htpasswd
<Limit GET POST>
require valid-users
</Limit>

AuthType
Hier kann Basic oder Digest stehen. Basic verwendet eine unsichere Kodierung des Passwortes, allerdings wird Digest nicht von allen Browsern beherrscht.
AuthName
Das ist der Titel der Authorisierung. Er erscheint in der Dialogbox und dient nur der Information des Anwenders, wofür er hier sein Passwort hinterlassen soll.
AuthUserFile
beschreibt den Pfadnamen der Passwortdatei (siehe unten).
require valid-users
bedeutet, dass nur Anwender zugelassen werden, die in der Passwortdatei unter AuthUserFile aufgeführt sind.

.htpasswd

Die Datei .htpasswd enthält die berechtigten Benutzer. Von einem Doppelpunkt getrennt erscheint dann das kodierte Passwort. Der Name und der Pfad dieser Datei wird durch die Direktive AuthUserFile festgelegt. Als Dateiname verwendet man tradionsgemäß .htpasswd. Der Pfad ist bei einem führenden Schrägstrich der absolute Pfad auf der Maschine. Bei Verwendung eines relativen Pfades geht dieser von dem Pfad aus, der in der zentralen Direktive ServerRoot genannt ist. Will man einen solchen Schutz in der eigenen Webpräsenz bei einem normalen Provider einbauen, muss man natürlich den Pfad der eigenen Webseite kennen. Freundliche Provider geben diese Information in der FAQ oder auf Anfrage heraus. Wenn Sie freien Zugriff auf den Rechner haben, sollten Sie die .htpasswd an einen Pfad legen, der außerhalb des ServerRoot legen, um ein Ausspähen der Passwörter zu erschweren.

Erstellen der .htpasswd

Um die Datei .htpasswd zu erstellen, verwendet man am einfachsten das Programm htpasswd. Hier wird eine Datei für die Benutzer arnold und andrea erstellt.

gaston> htpasswd -bc .htpasswd arnold aBc
Adding password for user arnold
gaston> htpasswd -b .htpasswd andrea PaSw
Adding password for user andrea
gaston> cat .htpasswd
arnold:Htg5PxchrVjLo
andrea:nF9VERTm.Su/Y
gaston>

Die Option -c in der ersten Zeile bedeutet create und erzeugt eine neue Passwortdatei. Weitere Benutzer werden nur mit der Option -b angehängt. Der Befehl cat zeigt, wie die Datei anschließend von innen aussieht.

Austausch per HTTP

Wie das Zusammenspiel zwischen Browser und Server abläuft, ist in der RFC 1945 festgelegt. Ein Webserver tauscht mit dem Browser an sich nur Texte aus. Durch die Möglichkeiten des Browsers bezüglich Hypertext, also des Verlinkens von Informationen und der Einbeziehung von Grafiken und anderer Multimedia wird allerdings eine große Vielfalt erzeugt.

GET, POST und HEAD

Das Protokoll arbeitet mit erstaunlich wenigen Kommandos. Trotzdem mehr Kommandos definiert sind, werden normalerweise hauptsächlich die Befehle GET, POST und HEAD eingesetzt.1) Beim HTTP ist Groß- und Kleinschreibung relevant. GET holt eine spezifizierte Datei und entspricht den normalen Anforderungen, wenn man durch das Web surft. HEAD liest nur den Kopf einer Seite. Dies wird vor allem von Suchmaschinenrobotern verwendet. Der Befehl POST wird für die Übertragung von Daten vom Browser an den Server benötigt, typischerweise in Formularen.

Im folgenden Auszug wird ein GET mit Hilfe des Befehls telnet simuliert. Zunächst gibt der Client den Befehl GET. Es folgt als Argument die gewünschte Datei mit dem vom Server aus gesehenen vollständigen Pfad. Als dritter Parameter folgt die HTTP-Version. Die Zeilen schließen mit Carriage Return und Line Feed, die durch ctrl-M und ctrl-J bei der Eingabe erreicht werden.

gaston> telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /index.htm HTTP/1.0

HTTP/1.1 200 OK Date: Mon, 01 Apr 2002 11:03:01 GMT Server: Apache/1.3.20 (Linux/SuSE) PHP/4.0.6 Last-Modified: Mon, 01 Apr 2002 11:02:40 GMT ETag: "4b286-7a-3ca83e50" Accept-Ranges: bytes Content-Length: 122 Connection: close Content-Type: text/html

<HTML> <BODY> <H1>Große Überschrift</H1>

Schauen Sie sich diesen <A HREF="quatsch.html">Quatsch</A> an.

</BODY> </HTML> Connection closed by foreign host. gaston>

Serverantworten

Der Server antwortet mit seiner HTTP-Version, der Bestätigung für die Anfrage, diverser Informationen wie Datenumfang und Dateityp. Dann durch eine Leerzeile getrennt mit dem Inhalt der Datei.

Statusloser Server

Man sieht das Trennen der Verbindung nach dem Übertragen der Seite. Der apache ist also ein statusloser Server. Das bedeutet, dass er im Gegensatz zum Newsserver oder Mailserver die Verbindung nach jeder Anfrage abbaut. Das ist zwar etwas einfacher zu implementieren und bringt auch bessere Stabilität und Performance, hat aber darin seinen Nachteil, dass jede Seitenanforderung für den Server neu ist. In Zeiten der Kommerzialisierung ist es beispielsweise nicht egal, welche Seiten in welcher Reihenfolge aufgerufen werden. Man möchte natürlich gern, dass die Maske mit der Kundenadresse auch seinem Warenkorb zugeordnet wird. Eine solche Wiedererkennung erfolgt über so genannte Cookies oder aber durch die Identifizierung der Browseraustattung und IP-Nummer des Kundenrechners.

Serverantworten

Der Server antwortet auf Anfragen mit einer Fehlermeldung, die durch eine dreistellige Zahl eingeleitet wird. Hier sind die in RFC 1945 definierten Fehlermeldungen in einer Tabellenübersicht dargestellt.

Basis Zahlencode Bedeutung
1xx Informativ
2xx Erfolgreich
200 OK
201 Created
202 Accepted
204 No Content. Anfrage ok, aber kein neuer Inhalt
3xx Es sind weitere Aktionen erforderlich
300 Mehrere Auswahlmöglichkeiten
301 Permanent auf anderer URL
302 Temporär auf anderer URL
304 Inhalt ist unverändert
4xx Fehler des Client
400 Fehlerhafte Anfrage, etwa ungültige URL
401 Nicht authorisiert
403 Verboten
404 Nicht gefunden
5xx Fehler des Servers
500 Interner Serverfehler
501 Nicht implementiert
502 Falsches Gateway (Proxy-Anwendung)
503 Server ist überlastet

Wie oben schon einmal angedeutet, kann man beim Auftreten der Fehlermeldungen auf eine eigene Seite verweisen, die nähere Informationen zu dem Problem gibt. Dazu verwendet man die Direktive ErrorDocument. Darauf folgt zuerst die Fehlernummer, dann das Dokument, das im Falle dieses Fehlers gerufen werden soll.

ErrorDocument 404 /err404.html

Am interessantesten dürfte das für die Fehlermeldung 404 Not Found sein. Beim Umgestalten von Websites werden durch Zusammenfassungen oft Seiten entfernt, die durchaus noch in den Suchmaschinen vorhanden sind. Mit einer eigenen Fehlerdatei kann man einen Link auf die Seiten setzen, die vergleichbare Informationen haben. Durch die Möglichkeit eine .htaccess in die Verzeichnisse zu legen, kann der Benutzer recht dicht an die Seiten geführt werden, die er nicht gefunden hat.

Virtuelles Hosting

Mit dem virtuellen Hosting ist es möglich, mehrere Web-Domänen auf einem Rechner zu realisieren. Zunächst müssen beide Domänen, beispielsweise per DNS auf denselben Rechner zeigen. Im zweiten Schritt wird in der Konfigurationsdatei httpd.conf abgestellt, welche Domänen vom Webserver-Prozess bedient werden. Dazu gibt es die Abschnitte VirtualHost. Beispiel:

<VirtualHost www.willemer.edu>
ServerName www.willemer.edu
ServerAlias willemer.edu *.willemer.edu
DocumentRoot /www/docs/willemer_edu
</VirtualHost>

<VirtualHost www.willi.edu> ServerName www.willi.edu ServerAlias willi.edu *.willi.edu DocumentRoot /www/docs/willi_edu </VirtualHost>

Mehrere Domänen, ein Host

Dieser Server wird also die Anfragen an www.willemer.edu als auch die an www.willi.edu beantworten. Dieses Verfahren wird bei Domainhostern eingesetzt, da diese nicht für jede Kundendomäne einen eigenen Rechner verwenden. Während wir bisher normalerweise die Situation hatten, dass mehrere Rechner zu einer Domäne gehören, teilen sich mehrere Domänen hier eine IP-Nummer. Allerdings ist zu bedenken, dass für Anwendungen mit IP-bassierenden Zertifikaten wie SSL, es immer noch notwendig ist, eigene IP-Nummern für jeden Hostnamen zu verwenden.

CGI: der Server schlägt zurück

Schnittstelle für Datenaustausch

CGI ist eine Schnittstelle zwischen dem Webserver und einer Anwendung. Die Idee ist, dass der Server dem Browser Daten liefert, die nicht starr sind, sondern durch den Inhalt von Datenbanken oder anderen Applikationen gespeist sind. Man könnte es so ausdrücken, dass ein normaler Browser zum Frontend einer Applikation wird. Dazu ist es notwendig, dass Webserver und Applikation miteinander sprechen. Das Interface hierzu ist CGI.

Bevor aber das erste CGI-Skript starten kann, muss seit Apache Version 2.4 der Einsatz von CGI freigeschaltet werden. Dazu wird das Modul cgi aktiviert.

a2enmod cgi

Serverprogramme starten

Wenn der Browser dynamisch erstellte Daten liefern soll, müssen auf dem Server Programme oder Skripten ablaufen. Der Serverprozess muss also auf einen Hinweis im HTML-Quelltext hin diesen Prozess starten. Das Ergebnis des gestarteten Prozesses soll normalerweise wieder auf dem Browser erscheinen. Die einfachste Art, von HTML aus einen Prozess auf dem Server zu starten, geht über einen HREF-Link.

<a href="http://www.server.de/cgi-bin/startmich">Start!</a>

Das Verzeichnis cgi-bin liegt typischerweise an anderer Stelle, als die HTML-Dateien für die Webpräsenz. Der Ort des cgi-bin wird durch die Konfiguration des Webservers festgelegt. In der Datei httpd.conf findet sich dazu die Zeile:

ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"

Betrachten wir nun den angestossenen Skript, der aus Demonstrationszwecken in einfachster Shell-Sprache der Bourne-Shell gehalten ist.

#!/bin/sh
echo "Content-type: text/html"
echo
# Inititalisierung beendet: es folgt der gesendete Text
echo "<HTML><BODY>
echo "Es ist gut, Sie hier zu sehen.<br>"
echo "MfG, Arnold Willemer"
echo "</BODY></HTML>

CGI-Programme geben HTML aus

Die Standardausgabe dieses gestarteten Programmes wird vom Server an den Browser als Input zugesandt. Wichtig ist die erste Zeile, die den Typ angibt und die darauf folgende Leerzeile, sonst zeigt der Browser gar nichts an. Danach wird der normale HTML-Code ausgegeben. Als CGI-Sprache eignet sich jede Programmiersprache, die den Standard Input lesen und den Standard Output schreiben kann, also fast jede Sprache. Perl hat seinen besonderen Platz als CGI-Sprache, weil sie mächtige Befehle zur Verarbeitung von Texten besitzt und diese in diesem Bereich besonders hilfreich sind.

Daten an den Server senden

Um das Beispiel zu erweitern, soll die Webseite Daten an den Server senden. Daten gelangen normalerweise über Formulare an den Webserver, die der Anwender in seinem Browser ausfüllt. Das folgende Formular wird nach Drücken auf den Button >>Start<< das Programm /cgi-bin/test02 durchstarten.

<HTML> <HEAD>
<TITLE>Testseite</TITLE>
</HEAD> <BODY>

<FORM ACTION="/cgi-bin/test02" METHOD="POST"> <INPUT TYPE="SUBMIT" VALUE="Start"> </FORM>

</BODY> </HTML>

In der Formulardeklaration verbirgt sich der Aufruf des CGI-Programmes unter ACTION. Die Übermittlung der Daten aus der Formularmaske an den Skript erfolgt per Standardeingabe, wenn als Methode so wie oben POST verwendet wird. Wenn wir folgende einfache Maske verwenden:

<FORM ACTION="/cgi-bin/test03" METHOD="POST">
<INPUT NAME="Name" VALUE="Name" SIZE=30>
<TEXTAREA Name="Adresse" ROWS=5 COLS=60>
Ihre Adresse
</TEXTAREA>
<INPUT TYPE="RADIO" NAME="Anrede" VALUE="Herr">
<INPUT TYPE="RADIO" NAME="Anrede" VALUE="Frau">
<INPUT TYPE="SUBMIT" VALUE="Start">
</FORM>

Die Maske wäre optisch natürlich noch durch eine Tabelle zu strukturieren und erläuternde Texte aufzupeppen. Hier soll es aber nur um den Mechanismus gehen und da kann es gar nicht schlicht genug sein. Den empfangenden Skript haben wir durch das Lesen der Standardeingabe erweitert.

#!/bin/sh
echo "Content-type: text/html"
echo
# Inititalisierung beendet: es folgt der gesendete Text
read maske
echo $maske

Der Inhalt des Formulars wird also in die Environment-Variable maske gelesen und anschließend wiedergegeben. Wir finden dann auf dem Browser die Zeile so wiedergegeben, wie das CGI-Programm sie empfängt.

Name=Willemer&Adresse=Ihre+Adresse%0D%0AOrt&Anrede=Frau

Format des Formularinhaltes

Man kann anhand der Zeile leicht erkennen, wie der Aufbau der übermittelten Daten aussieht. Die Zuordnung der Elemente hat die Struktur

Feldname=Wert&Feldname=Wert&Feldname=Wert

Die Eingabeelemente werden durch & getrennt. Leerzeichen in Eingabefeldern werden durch ein + ersetzt. Bei den mehrzeiligen Texteingabefeldern (TEXTAREA) werden die Zeilen durch %0D%0A abgeschlossen.

Perspektive

Aus den Rohdaten der Formularmaske lassen sich die eingegebenen Werte isolieren. Damit kann man beispielsweise eine Datenbankanfrage starten. Das Ergebnis kann man mit HTML-Tags mischen und über die Standardausgabe an den Browser zurückgeben.

Während beim CGI das Programm die Seite als Ausgabe komplett erzeugt, werden bei der Programmiersprache PHP die Befehle in die Webseite eingebunden wird und nur die zusätzlich errechneten Ausgaben erzeugt, wo der Code steht. Naheliegenderweise sind diese Programme etwas schlanker, da nicht auch alle statischen Seitenbestandteile einzeln programmiert werden müssen. Der Interpreter von PHP wird nicht als separates Programm gestartet, sondern als Modul.

Auch Java bedient sich des HTTP-Protokolls. Dort findet es weite Anwendung für die Kommunikation zum Application-Server. Mit den Java Server Pages lassen sich - ähnlich wie bei PHP - Programmfragmente in einer HTML-Seite einbetten.


1 Bowen, Rich/Coar, Ken: Apache und CGI. Markt und Technik, 2000. S. 42.

Diese Seite basiert auf den überarbeiteten Inhalten aus dem Buch
Arnold Willemer: UNIX - das umfassende Handbuch
Die Genehmigung zur Veröffentlichung erfolgte freundlicherweise durch den Verlag Galileo, jetzt Rheinwerk.
Das Buch ist inzwischen vergriffen. Der Autor hat inzwischen im Sybex-Verlag das Buch
Arnold Willemer: Linux Server für Einsteiger
geschrieben.


Homepage (C) Copyright 2002, 2016 Arnold Willemer