11. Cookies und den Header mit PHP setzen

Zuletzt haben wir uns im Rahmen des PHP Tutorials mit Sessions beschäftigt. Von diesem Thema werden wir uns dieses Mal gar nicht so weit entfernen.

Die PHP Sessions basieren im Wesentlichen auf Cookies. Und diese werden über die sogenannten Header gesetzt. Wie du diese Header setzen kannst und welche Rolle sie spielen, erfährst Du im Folgenden.

HTTP Header

Mit jeder Anfrage wird ein sogenannter Header gesetzt. Dieser enthält wichtige Informationen zur Verarbeitung der Anfrage. Hier einmal ein Beispiel für die Header, die mein Browser sendet, wenn er das Tool von reliply.org aufruft.

Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0
HTTP-Connection: keep-alive
DNT: 1
Request-Method:	GET

Zum einen enthält der Header Informationen über meinen Browser, den User-Agent. Außerdem teile ich dem Webserver mit, welche Inhalte (Sprachen, Komprimierung) mein Browser korrekt verarbeiten kann. Der Header enthält also hauptsächlich wichtige Informationen über die Art der Anfrage.

Der Header „DNT“ (Do Not Track) bildet dort eine Ausnahme, mit ihm bitte ich die Website darum, meine Aktivitäten nicht zu tracken. Das Problem hinter dieser Idee habe ich bereits in einem anderen Artikel erläutert.

Sobald der Webserver mich einmal über den Header dazu aufgefordert hat, ein Cookie zu speichern, wird mein Browser die Informationen, die in diesem Cookie gespeichert wurden, mit jeder Anfrage wieder an den Server zurücksenden. So erklärt sich auch, wie der Webserver Cookies abfragen kann.

Nicht nur wenn ich Dateien abrufe hinter denen offensichtlich ein PHP-Skript steckt, werden Header-Daten mitgesendet, sondern bei jedem Request. Das heißt, auch wenn eine Website ein kleines Bild von einer anderen Website nachlädt – zum Beispiel von facebook.com – könnte Facebook anhand deines Cookies sehen, dass Du auf Facebook eingeloggt bist.

Mit PHP Cookie setzen

Das klingt erstmal ein sehr negativ. Doch ohne Cookies gibt es auch keine Logins. Wie sollst du sonst identifiziert werden? Wir benötigen Cookies, und so stellt auch PHP die Funktion setcookie() bereit, um selbst Cookies zu setzen.

Du kannst also theoretisch eine eigene Session-Verwaltung umsetzen und hast so die volle Kontrolle über die Sitzungen. Es können aber auch einfach nur kleine Einstellungen gespeichert werden. Zum Beispiel, wenn ein Nutzer trotz mobilem Gerät die Desktop-Version nutzen möchte.

setcookie() ist recht einfach zu bedienen. Ich erläutere Dir die Verwendung einfach mal anhand eines Beispiels:

<?php
  
  setcookie('CookieName', 'Cookie-Inhalt', (time()+3600), '/', '.www-coding.de', false, true);
  /* 
   * @name Name des Cookies
   * @value Wert/Inhalt des Cookies
   * @expire Zeitpunkt als Unix-Timestamp, an dem der Cookie verfällt
   * @path Pfad der Website, der den Cookie lesen darf, ('/foo/' nur '/foo/' und Unterverzeichnisse, '/' alle Ordner)
   * @domain Domain, die den Cookie lesen darf, z.B. 'www-coding.de' (nur Hauptdomain), 'subdomain.www-coding.de' (nur Subdomain) oder '.www-coding.de' (Hauptdomain und alle Subdomains)
   * @secure Wenn true wird Cookie nur über eine HTTPS-Verbindung übertragen
   * @httponly Wenn true hat JavaScript keinen Zugriff auf das Cookie (kann Cross-Site-Scripting verhindern)
   * 
   * 
   */

  echo "Erst danach darf eine Ausgabe erfolgen.";
?>

Wichtig: Cookies können nur dann gesetzt werden, wenn noch keinerlei Ausgabe (kein Leerzeichen vor „<?php“, kein echo & Co.) erfolgt ist.

Wie Du siehst, kann ein Cookie auch immer nur einer Domain (inklusive allen Subdomains) zugeordnet werden. Die Domain example.org kann also nicht auf das Cookie, was www-coding.de gesetzt hat, zugreifen.

PHP Header-Funktion

Wenn Du beispielsweise dem Nutzer eine Datei zum Download anbieten möchtest, musst Du dies per Header machen (siehe auch: Datei-Download mit PHP). Dafür gibt es die header() Funktion.

Mit ihr kannst du eigene Header setzen. Am wichtigsten ist dabei der erste Parameter. Damit setzt du den Header in der Form: „Name: Wert“.  Zur Verdeutlichung gleich einmal mehrere Beispiele.

1. Du hast zuvor ein Bild mit der GD-Bibliothek erstellt, die Ressource ist $img. Möchtest Du es nun als PNG ausgeben, muss zuvor der entsprechende Header-gesetzt werden:

<?php

  $img = imagecreatefrompng("test.png"); // Bildressource erstellen, aus der Datei "test.png"

  header('Content-Type: image/png'); // Header setzen, um korrekten Content-Type zu übergeben

  imagepng($img); // Bildstrom ausgeben
  imagedestroy($img); // Bild-Ressource (nicht die Datei) löschen
?>

 2. Deine Website soll UTF-8 verwenden. Das muss dem Besucher über den entsprechenden Header mitgeteilt werden:

<?php
  header("Content-Type: text/html; charset=utf-8");
  // Folgender Code ...
?>

3. Du möchtest einen 404-Header zurückgeben, um dem Besucher mitzuteilen, dass die aufgerufene Seite nicht existiert:

<?php
  header("HTTP/1.1 404 Not Found");
  echo "Die Website konnte nicht gefunden werden";
?>

Und, nicht vergessen: Auch die header() Funktion kann nur vor jeglicher Ausgabe aufgerufen werden.

Fazit zu den Headern & Cookies in PHP

PHP stellt gleich mehrere Funktionen bereit, sodass man Header allgemein oder speziell (Cookies) setzen kann. Dadurch eröffnen sich viele Möglichkeiten. Häufig muss man aber auch gewisse Header setzen. Beispielsweise bei einem Datei-Download via PHP oder bei der UTF-8 Kodierung.

Unsere PHP-Tutorial-Serie neigt sich so langsam dem Ende zu. Doch im vorletzten und nächsten Beitrag soll es noch um objektorientiertes PHP gehen. Bis dahin.

Ein Gedanke zu „11. Cookies und den Header mit PHP setzen“