PHP Header für jede Gelegenheit

Heute habe ich mal alle meine PHP Sourcen nach Aufruf der PHP Methode “header” durchsucht und dabei eine sehr große Menge an unterschiedlichen Einsatzzwecken für diese Funktion gefunden, die ich euch nun hier präsentieren möchte. Darunter sind einige Varianten, die ich quasi bei der täglichen Arbeit brauche (z.B. der PHP Code für den HTTP Header zum deaktivieren des Browser Caches) und einige sind dabei, die ich doch eher selten verwende. Z.B. Der Refresh Header. Da das aber je nach Aufgabengebiet bei jedem Entwickler anders aussieht, habe ich hier einfach mal alle jemals von mir einsetzten PHP Header Aufrufe zusammengefasst und kurz dokumentiert.

PHP Snippet “Kein Browser Cache verwenden”

header(“Expires: 0″);
header(“Cache-Control: must-revalidate, post-check=0, pre-check=0″);
header(“Cache-Control: private”,false);
header(“Cache-Control: no-cache”);
header(“Pragma: no-cache”);
header(“Expires: gmdate(“D, d M Y H:i:s”) . ” GMT”);
header(“Last-Modified: ” . gmdate(“D, d M Y H:i:s”) . ” GMT”);

 Der Klassiker unter den HTTP Headern zum deaktivieren des Browser Caches. Wenn man den vergisst, machen die Tests erst richtig Spaß :-) .

PHP Snippet “Browser Cache für eine vorgegebene Zeit nutzen”

$expires = 60*60*24*14;
header(“Pragma: public”);
header(“Cache-Control: maxage=”.$expires);
header(‘Expires: ‘ . gmdate(‘D, d M Y H:i:s’, time()+$expires) . ‘ GMT’);
header(‘Last-Modified: ‘ . gmdate(‘D, d M Y H:i:s’) . ” GMT”);

 In einigen Fällen macht es auch Sinn, den Browser Cache nicht zu deaktivieren. Statt dessen kann man mit den 5 Zeilen den Browser Cache mit dem HTTP Header steuern und die Verfallszeit der Inhalte einstellen. Die Einstellungen werden auch gerne vom Proxy verwendet. Daher kann es passieren, dass auch ein Löschen des Browser Caches nicht den gewünschten Effekt erzeilt.

PHP Snippet “Datei nicht gefunden”

header(‘HTTP/1.1 404 Not Found’);

Wenn man dem Broser einen 404 Fehler mitteilen möchte, kann man das mit der einfachen Zeile realisieren.

PHP Snippet “Zugriff verweigert.”

header(‘HTTP/1.1 403 Forbidden’);

Finger weg von der Datei. Mehr sagt die Zeile eigentlich nicht aus :-) . Wird gerne auch vom Apache genutzt, wenn leere Verzeichnisse im htdocs Ordner aufgerufen werden und der DirectoryIndex deaktiviert ist.

PHP Snippet “Zugriff verweigert. Login/Passwort Popup”

header(‘HTTP/1.1 401 Unauthorized’);
header(‘WWW-Authenticate: Basic realm=”Zugriff verweigert”‘);
print ‘Bitte Zugangsdaten eingeben … oder so :-) ’;
die();

Wenn man den Zugriff auf bestimmte Dateien nicht erlauben möchte, kann man das mit den 4 Zeilen ermöglichen.

PHP Snippet “Permanente Weiterleitung auf eine neue Webseite”

header(‘HTTP/1.1 301 Moved Permanently’);
header(‘Location: http://www.beispielseite.de/’);

Ein weiterer Klassiker. Die Seite hat einen neuen URL bekommen und der Browser wird zur neuen Location weitergeleitet.

PHP Snippet “Verzögerte Weiterleitung”

header(‘Refresh: 10; url=http://www.beispielseite.de/’);
print ‘Weiterleitung erfolgt in 10 Sekunden’;

Eine Weiterleitung, die um 10 Sekunden verzögert ist. Macht in Ausnahmen sinn, aber ist nicht der Standard. In den meisten Fällen kann man besser den 301 oder 302 nutzen.

PHP Snippet “Interner Fehler. Sollte möglichst nicht passieren :-)

header(‘HTTP/1.1 500 Internal Server Error’);

Den HTTP Code 500 sollte man nicht gerade im Code verwenden. Es gibt zwar Situationen, in denen das sinn macht, aber ich kenne keinen Entwickler, der sich über einen 500er freut :-) .

PHP Snippet “Sprache der Inhalte im HTTP Header”

header(‘Content-language: de’);

Wenn man weiß, dass der Inhalt des HTTP Bodys in Deutsch ist, kann man es dem Browser (oder der Suchmaschine :-) ) auch mitteilen.

PHP Snippet “Seite hat sich nicht geändert”

header(‘HTTP/1.1 304 Not Modified’);

Hier wird dem Browser mitgeteilt, dass sich an dem Inhalt nichts geändert hat. dementsprechend wird die Darstellung im Browser auch nicht aktualisiert.

PHP Snippet “Größe der HTTP Body Contents in Bytes”

header(‘Content-Length: 100000′);

Sollte für Downloads benutzt werden. Dann kann der Fortschrittsbalken im Browser vernünftig dargestellt werden und die erwartete Zeit für den Download berechnet werden.

PHP Snippet “Diese Inhalt werden nicht dargestellt, sondern im Browser zum Download angeboten”

header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=”meine-datei.txt”‘);
header(‘Content-Transfer-Encoding: binary’);

Wird diese HTTP Header Kombination verwendet, wird der Inhalt nicht im Browser dargestellt, sondern der Inhalt zum Download angeboten. Im Chrom wird die Datei direkt im Downloads Ordner abgelegt. Im Firefox geht der “Speichern unter” Dialog auf.

PHP Snippet “Setzen der Codierung”

header(‘Content-Type: text/html; charset=utf-8′);

Typische Kodierungen in Deutschland sind:

  •  iso-8859-1
  •  utf-8

Ich persönlich bevorzuge utf-8, aber das ist jedem selbst überlassen. Hier noch eine (nicht vollständige) Liste mit den Typischen Werten für Charset:

big5 = Chinese Traditional (Big5)
euc-kr = Korean (EUC)
iso-8859-1 = Western Alphabet
iso-8859-2 = Central European Alphabet (ISO)
iso-8859-3 = Latin 3 Alphabet (ISO)
iso-8859-4 = Baltic Alphabet (ISO)
iso-8859-5 = Cyrillic Alphabet (ISO)
iso-8859-6 = Arabic Alphabet (ISO)
iso-8859-7 = Greek Alphabet (ISO)
iso-8859-8 = Hebrew Alphabet (ISO)
koi8-r = Cyrillic Alphabet (KOI8-R)
shift-jis = Japanese (Shift-JIS)
x-euc = Japanese (EUC)
us-ascii = US-ASCII
utf-7 = Unicode (UTF-7)
utf-8 = Universal Alphabet (UTF-8)
windows-1250 = Central European Alphabet (Windows)
windows-1251 = Cyrillic Alphabet (Windows)
windows-1252 = Western Alphabet (Windows)
windows-1253 = Greek Alphabet (Windows)
windows-1254 = Turkish Alphabet
windows-1255 = Hebrew Alphabet (Windows)
windows-1256 = Arabic Alphabet (Windows)
windows-1257 = Baltic Alphabet (Windows)
windows-1258 = Vietnamese Alphabet (Windows)
windows-874 = Thai (Windows)

PHP Snippet “Content Type festlegen”

header(‘Content-Type: text/plain’); // Textdatei
header(‘Content-Type: image/jpeg’); // JPG Bild
header(‘Content-Type: image/png); // PNG Bild
header(‘Content-Type: application/zip’); // Zip-Datei
header(‘Content-Type: application/pdf’); // PDF Datei

Neben diesen Beispiel Content Types gibt es noch eine Reihe anderer Content Types, die ich hier nicht alle aufführen möchte. Daher habe ich der Einfachheit halber die Datei „/etc/mime.types“ von meinem Linux System hier zum Download bereitgestellt. In der Datei sind alle nur denkbaren Content Types enthalten.

mime.types

Der Aufbau ist wie folgt:

Spate 1: Name des Content Types
Spalte 2 – n: Dateiendung des Content Types (optional)

Wem hier noch was fehlt, dem kann ich nur den folgenden Wikipedia Artikel empfehlen. Hier werden wirklich alle HTTP Header Felder aufgelistet und kurz erklärt.

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

So, nun sollten aber alle Fragen zum Thema PHP Header beantwortet sein. Sollten doch noch Fragen offen sein, benutzt bitte die Kommentar-Funktion.

 

Michael Jentsch

Michael Jentsch arbeitet seit 2006 bei der Itellium Services GmbH als Entwickler und Software Architekt. Er ist spezialisiert auf Java basierte Web-Applikationen und E-Commerce. Neben dem Beruf interessiert er sich auch für Suchmaschinenoptimierung und ist engagiert in vielen Open Source Projekten im Web Umfeld. Sie erreichen ihn per E-Mail unter [email protected].

More Posts

Comments

  1. Also “Sprache” und “Browser Cache” gebe ich eigentlich lieber direkt im head-Bereich des Dokuments an. Wer ausschließlich dynamische Sites aufbaut, dürfte dann wohl mal hieir was kopieren :-)

Speak Your Mind

*


*

«
facebook this
"));