PHP/MySQL - Header - HTTP-Header
1. Die Abschnitte
- Erläuterung
- "Cannot modify ..."
- Pufferung
- Kleine Beispiele
- Internet Media Type
- Dateien
- Downloads
- Charset
- HTTP-Header
2. Feinheiten
Wie ich schon eingangs unter Punkt 6 sagte, kann nach einem HTTP-Header kein weiterer normaler Header gesendet werden. Das gilt allerdings nicht für die Status-Varianten, da sie ebenfalls zur ersten Kategorie gehören. So funktioniert folgendes Beispiel wunderbar.
<?php
header('HTTP/1.0 404 not found');
header("Status: 404 not found");
?>
Erläuterung
Zuerst übergibt man die Versionsnummer des Protokolls, in diesem Fall also HTTP 1.0
. Möglich wäre auch HTTP
1.1
. Danach kommt der Statuscode 404
gefolgt von der vorgegebenen Bedeutung. Anschließend sendet man noch den
Status mit den schon erwähnten Angaben.
Ach ja, eine komplette Liste findet ihr, wie gehabt, bei
Wikipedia. Da könnt ihr dann auch sehen, was mit den
Protokollen HTTP 1.0
und HTTP 1.1
möglich ist.
Die dazu gehörende Datei nennt sich 404.php
und befindet sich im Ordner http_header
. Wenn ihr sie allerdings
im Browser aufruft, so passiert gar nichts. Ihr seht nur eine leere Seite. Außer im Internet Explorer, der mal wieder sein eigenes
Süppchen kocht. Und warum geschieht nichts? Nun, wir senden dem Browser(!) die Meldung, dass die angeforderte Datei nicht vorhanden
ist. Da es sie aber trotzdem gibt, nimmt er das einfach zur Kenntnis. Damit ihr die Funktionsweise begreift, installiert mal das Addon
Live HTTP Header für den Firefox. Dann seht ihr, was
passiert. Ach ja, warum der Internet Explorer uns eine so schöne Seite mit diversen Infos präsentiert, bleibt das Geheimnis der
Programmierer.
Warum keine 404-Seite
Ganz einfach. Wenn man versucht, eine Seite von einem Server anzufordern, die nicht existiert, so geschieht dies. Der Webserver sucht,
findet nichts und sendet dann je nach Konfiguration (ErrorDocument
in der http.conf
) eine entsprechende
Antwort an den Client. In diesem Fall sendet aber die existierende(!) Datei den 404-Status. Verstanden?
3. Einsatzmöglichkeiten
Wie ihr also gelernt habt, bringt es herzlich wenig, einfach so einen Header zu senden. Aber wann braucht man das? Zum Beispiel wenn ein Script von Server A über ein anderes Script von Server B eine wie auch immer geartete Datei anfordert. Ist letztere nicht vorhanden, so sendet Script B an Script A den 404-Header, also "Datei nicht gefunden". Und das kann dann von Script A ausgewertet werden. Ist ein wenig kompliziert und für Anfänger schwer verständlich, aber zumindest wisst ihr jetzt, wann man damit arbeitet.
4. Eine Ausnahme
... ist der Statuscode 401
. Das bedeutet, dass ohne Authentifizierung ein Zugriff nicht möglich ist. In PHP kann man über
die superglobalen Variablen $_SERVER['PHP_AUTH_USER']
und $_SERVER['PHP_AUTH_PW']
auf den eingegebenen
Benutzernamen und Passwort zugreifen. Aber nur, wenn PHP als Modul läuft und nicht über CGI
! Ein kleines Beispiel, das
ihr auch in der Datei authentifizierung.php
im Ordner http_header
findet:
<?php
if (isset($_SERVER['PHP_AUTH_USER'])
&& isset($_SERVER['PHP_AUTH_PW']))
{
if ('bla' == $_SERVER['PHP_AUTH_USER'] &&
'blubb' == $_SERVER['PHP_AUTH_PW'])
{
echo 'Willkommen.';
}
else
{
echo 'Nö, ist nich!';
}
}
else
{
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Private');
}
?>
Erläuterung
Zuerst sollte man mit der ersten Bedingung prüfen, ob die beiden Variablen $_SERVER['PHP_AUTH_USER']
und
$_SERVER['PHP_AUTH_PW']
überhaupt gesetzt sind. Denn sonst bekommt ihr je nach
Error Reporting unter Umständen ein Notice
ausgeworfen. Und da das schon
eine Ausgabe an den Browser ist, funktioniert der restliche Code nicht mehr.
Dann prüfen wir mittels if ($_SERVER['PHP_AUTH_USER'] == 'bla' && $_SERVER['PHP_AUTH_PW'] == 'blubb')
, ob die
vorgegebenen Zugangsdaten vorhanden sind. Da die beim erstmaligen Aufruf einer Seite nicht vorhanden sind, schicken wir im
else
-Zweig den entsprechenden Header mittels header('HTTP/1.0 401 Unauthorized');
, der einfach nur besagt,
"Zugriff nicht autorisiert". Um aber dem User die Möglichkeit zu geben, die Daten einzugeben, jagt man ein header('WWW-Authenticate:
Basic realm="Private');
hinterher.
Mit diesem Header veranlasst man den Browser, ein Fenster zu öffnen, in dem man nun die Daten eingeben kann. Und die stehen dann in den oben genannten superglobalen Variablen zur Verfügung. Auf die Details gehe ich im Moment nicht ein. Spielt mal ein wenig damit herum, dann versteht ihr das Prinzip schon.
5. Fazit
Ich hoffe, ihr habt den ersten Einstieg in die Möglichkeiten von Headern bekommen. Allerdings gebe ich zu, dass da noch viel mehr hinter hängt. Aber darauf gehe ich später mal in einem Tutorial für "Fortgeschrittene" ein.