Hauptmenü

Untermenü

PHP/MySQL - Header - HTTP-Header

1. Die Abschnitte

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.

zurück zum vorherigen Abschnitt