Advertisement
Scroll to top
Read Time: 18 min

() translation by (you can also view the original English article)

Egal, ob Sie Programmierer sind oder nicht, Sie haben es überall im Web gesehen. In diesem Moment zeigt die Adressleiste Ihres Browsers etwas an, das mit "https://" beginnt. Sogar Ihr erstes Hello World-Skript hat HTTP-Header gesendet, ohne dass Sie es merken. In diesem Artikel erfahren Sie mehr über die Grundlagen von HTTP-Headern und wie wir sie in unseren Webanwendungen verwenden können.

Was sind HTTP-Header?

HTTP steht für „Hypertext Transfer Protocol“. Das gesamte World Wide Web verwendet dieses Protokoll. Es wurde Anfang der 90er Jahre gegründet. Fast alles, was Sie in Ihrem Browser sehen, wird über HTTP an Ihren Computer übertragen. Wenn Sie beispielsweise diese Artikelseite geöffnet haben, hat Ihr Browser wahrscheinlich über 40 HTTP-Anfragen gesendet und für jede HTTP-Antworten erhalten.

HTTP-Header sind das Herzstück dieser HTTP-Anfragen und -Antworten und enthalten Informationen über den Client-Browser, die angeforderte Seite, den Server und mehr.

Beispiel

Wenn Sie eine URL in Ihre Adressleiste eingeben, sendet Ihr Browser eine HTTP-Anfrage, die so aussehen kann:

1
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
2
Host: net.tutsplus.com
3
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5
Accept-Language: en-us,en;q=0.5
6
Accept-Encoding: gzip,deflate
7
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8
Keep-Alive: 300
9
Connection: keep-alive
10
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
11
Pragma: no-cache
12
Cache-Control: no-cache

Die erste Zeile ist die "Anfragezeile", die einige grundlegende Informationen zur Anfrage enthält. Der Rest sind die HTTP-Header.

Nach dieser Anfrage erhält Ihr Browser eine HTTP-Antwort, die wie folgt aussehen kann:

1
HTTP/1.x 200 OK
2
Transfer-Encoding: chunked
3
Date: Sat, 28 Nov 2009 04:36:25 GMT
4
Server: LiteSpeed
5
Connection: close
6
X-Powered-By: W3 Total Cache/0.8
7
Pragma: public
8
Expires: Sat, 28 Nov 2009 05:36:25 GMT
9
Etag: "pub1259380237;gz"
10
Cache-Control: max-age=3600, public
11
Content-Type: text/html; charset=UTF-8
12
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
13
X-Pingback: https://net.tutsplus.com/xmlrpc.php
14
Content-Encoding: gzip
15
Vary: Accept-Encoding, Cookie, User-Agent
16
17
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
18
<html xmlns="http://www.w3.org/1999/xhtml">
19
<head>
20
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
21
<title>Top 20+ MySQL Best Practices - Nettuts+</title>
22
<!-- ... rest of the html ... -->

Die erste Zeile ist die "Statuszeile", gefolgt von "HTTP-Headern" bis zur Leerzeile. Danach startet der "Inhalt" (in diesem Fall eine HTML-Ausgabe).

Wenn Sie sich den Quellcode einer Webseite in Ihrem Browser ansehen, sehen Sie nur den HTML-Anteil und nicht die HTTP-Header, obwohl diese tatsächlich zusammen übertragen wurden, wie Sie oben sehen.

Diese HTTP-Anfragen werden auch für andere Dinge gesendet und empfangen, wie z. B. Bilder, CSS-Dateien, JavaScript-Dateien usw. Aus diesem Grund habe ich vorhin gesagt, dass Ihr Browser beim Laden dieser Artikelseite mindestens 40 oder mehr HTTP-Anfragen gesendet hat.

Lassen Sie uns nun beginnen, die Struktur genauer zu überprüfen.

Wie kann man HTTP-Header sehen?

Ich verwende die folgenden Firefox-Erweiterungen, um HTTP-Header zu analysieren:

In PHP:

Weiter im Artikel werden wir einige Codebeispiele in PHP sehen.

HTTP-Anforderungsstruktur

Die erste Zeile des HTTP-Requests wird als Request-Zeile bezeichnet und besteht aus 3 Teilen:

  • Die "Methode" gibt an, um welche Art von Anfrage es sich handelt. Die gängigsten Methoden sind GET, POST und HEAD.
  • Der "Pfad" ist im Allgemeinen der Teil der URL, der nach dem Host (der Domäne) kommt. Zum Beispiel, wenn Sie "https://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/" anfordern. , der Pfadteil ist "/tutorials/other/top-20-mysql-best-practices/".
  • Der Teil "Protokoll" enthält "HTTP" und die Version, die in modernen Browsern normalerweise 1.1 ist.

Der Rest der Anfrage enthält HTTP-Header als "Name: Value"-Paare in jeder Zeile. Diese enthalten verschiedene Informationen über die HTTP-Anfrage und Ihren Browser. Die Zeile „User-Agent“ gibt beispielsweise Auskunft über die Browserversion und das von Ihnen verwendete Betriebssystem. "Accept-Encoding" teilt dem Server mit, ob Ihr Browser komprimierte Ausgaben wie gzip akzeptieren kann.

Sie haben vielleicht bemerkt, dass die Cookie-Daten auch innerhalb eines HTTP-Headers übertragen werden. Und wenn es eine verweisende URL gäbe, wäre diese auch in der Kopfzeile gewesen.

Die meisten dieser Header sind optional. Diese HTTP-Anfrage hätte so klein sein können:

1
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
2
Host: net.tutsplus.com

Und Sie würden immer noch eine gültige Antwort vom Webserver erhalten.

Anfragemethoden

Die drei am häufigsten verwendeten Anfragemethoden sind: GET, POST und HEAD. Die ersten beiden kennen Sie wahrscheinlich bereits aus dem Schreiben von HTML-Formularen.

GET: Abrufen eines Dokuments

Dies ist die Hauptmethode zum Abrufen von HTML, Bildern, JavaScript, CSS usw. Die meisten Daten, die in Ihrem Browser geladen werden, wurden mit dieser Methode angefordert.

Wenn Sie beispielsweise einen Nettuts+-Artikel laden, sieht die allererste Zeile der HTTP-Anfrage so aus:

1
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
2
...

Sobald der HTML-Code geladen ist, sendet der Browser eine GET-Anfrage für Bilder, die wie folgt aussehen können:

1
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
2
...

Webformulare können so eingestellt werden, dass sie die Methode GET verwenden. Hier ist ein Beispiel.

1
<form method="GET" action="foo.php">
2
3
First Name: <input type="text" name="first_name" /> <br />
4
Last Name: <input type="text" name="last_name" /> <br />
5
6
<input type="submit" name="action" value="Submit" />
7
8
</form>

Wenn dieses Formular gesendet wird, beginnt die HTTP-Anfrage wie folgt:

1
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
2
...

Sie können sehen, dass jede Formulareingabe zur Abfragezeichenfolge hinzugefügt wurde.

POST: Daten an den Server senden

Obwohl Sie mit GET und dem Abfragestring Daten an den Server senden können, ist POST in vielen Fällen vorzuziehen. Das Senden großer Datenmengen mit GET ist nicht praktikabel und unterliegt Einschränkungen.

POST-Anfragen werden am häufigsten über Webformulare gesendet. Ändern wir das vorherige Formularbeispiel in eine POST-Methode.

1
<form method="POST" action="foo.php">
2
3
First Name: <input type="text" name="first_name" /> <br />
4
Last Name: <input type="text" name="last_name" /> <br />
5
6
<input type="submit" name="action" value="Submit" />
7
8
</form>

Das Absenden dieses Formulars erzeugt eine HTTP-Anfrage wie diese:

1
POST /foo.php HTTP/1.1
2
Host: localhost
3
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5
Accept-Language: en-us,en;q=0.5
6
Accept-Encoding: gzip,deflate
7
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8
Keep-Alive: 300
9
Connection: keep-alive
10
Referer: http://localhost/test.php
11
Content-Type: application/x-www-form-urlencoded
12
Content-Length: 43
13
14
first_name=John&last_name=Doe&action=Submit

Hier sind drei wichtige Dinge zu beachten:

  • Der Pfad in der ersten Zeile ist einfach /foo.php und es gibt keinen Abfragestring mehr.
  • Die Header Content-Type und Content-Length wurden hinzugefügt, die Informationen über die gesendeten Daten liefern.
  • Alle Daten werden jetzt nach den Headern gesendet, mit demselben Format wie der Abfragestring.

POST-Methodenanfragen können auch über AJAX, Anwendungen, cURL usw. erfolgen. Und alle Datei-Upload-Formulare sind erforderlich, um die POST-Methode zu verwenden.

HEAD: Header-Informationen abrufen

HEAD ist identisch mit GET, außer dass der Server den Inhalt in der HTTP-Antwort nicht zurückgibt. Wenn Sie eine HEAD-Anfrage senden, bedeutet dies, dass Sie nur an dem Antwortcode und den HTTP-Headern interessiert sind, nicht am Dokument selbst.

"Wenn Sie eine HEAD-Anfrage senden, bedeutet dies, dass Sie nur an dem Antwortcode und den HTTP-Headern interessiert sind, nicht am Dokument selbst."

Mit dieser Methode kann der Browser zu Caching-Zwecken überprüfen, ob ein Dokument geändert wurde. Es kann auch prüfen, ob das Dokument überhaupt existiert.

Wenn Sie beispielsweise viele Links auf Ihrer Website haben, können Sie regelmäßig HEAD-Anfragen an alle senden, um nach defekten Links zu suchen. Dies funktioniert viel schneller als die Verwendung von GET.

HTTP-Antwortstruktur

Nachdem der Browser die HTTP-Anfrage gesendet hat, antwortet der Server mit einer HTTP-Antwort. Ohne den Inhalt sieht es so aus:

Das erste Datenelement ist das Protokoll. Auf modernen Servern ist dies wiederum meist HTTP/1.x oder HTTP/1.1.

Der nächste Teil ist der Statuscode gefolgt von einer kurzen Nachricht. Code 200 bedeutet, dass unsere GET-Anfrage erfolgreich war und der Server den Inhalt des angeforderten Dokuments direkt nach den Headern zurückgibt.

Wir alle haben "404" Seiten gesehen. Diese Nummer stammt eigentlich aus dem Statuscodeteil der HTTP-Antwort. Wenn die GET-Anfrage für einen Pfad gestellt würde, den der Server nicht finden kann, würde er mit 404 statt 200 antworten.

Der Rest der Antwort enthält Header wie die HTTP-Anfrage. Diese Werte können Informationen über die Serversoftware, wann die Seite/Datei zuletzt geändert wurde, den MIME-Typ usw. enthalten.

Auch hier sind die meisten dieser Header tatsächlich optional.

HTTP-Statuscodes

  • 200er werden für erfolgreiche Anfragen verwendet.
  • 300er sind für Umleitungen.
  • 400er werden verwendet, wenn ein Problem mit der Anforderung aufgetreten ist.
  • 500er werden verwendet, wenn ein Problem mit dem Server aufgetreten ist.

200 OK

Wie bereits erwähnt, wird dieser Statuscode als Antwort auf eine erfolgreiche Anfrage gesendet.

206 Teilinhalt

Wenn eine Anwendung nur einen Bereich der angeforderten Datei anfordert, wird der Code 206 zurückgegeben.

Es wird am häufigsten mit Download-Managern verwendet, die einen Download stoppen und fortsetzen oder den Download in Teile aufteilen können.

404 Nicht gefunden

Wenn die angeforderte Seite oder Datei nicht gefunden wurde, wird vom Server ein 404-Antwortcode gesendet.

401 nicht Autorisiert

Passwortgeschützte Webseiten senden diesen Code. Wenn Sie ein Login nicht korrekt eingeben, wird möglicherweise Folgendes in Ihrem Browser angezeigt.

Beachten Sie, dass dies nur für HTTP-passwortgeschützte Seiten gilt, die Anmeldeaufforderungen wie diese anzeigen:

403 Verboten

Wenn Ihnen der Zugriff auf eine Seite nicht gestattet ist, kann dieser Code an Ihren Browser gesendet werden. Dies passiert oft, wenn Sie versuchen, eine URL für einen Ordner zu öffnen, der keine Indexseite enthält. Wenn die Servereinstellungen die Anzeige des Ordnerinhalts nicht zulassen, erhalten Sie einen 403-Fehler.

Auf meinem lokalen Server habe ich beispielsweise einen Bilderordner erstellt. In diesem Ordner habe ich eine .htaccess-Datei mit dieser Zeile abgelegt: "Options-Indexes". Wenn ich jetzt versuche, http://localhost/images/ zu öffnen, sehe ich Folgendes:

Es gibt andere Möglichkeiten, den Zugriff zu sperren, und 403 kann gesendet werden. Zum Beispiel können Sie mit Hilfe einiger htaccess-Anweisungen nach IP-Adresse blockieren.

1
order allow,deny
2
deny from 192.168.44.201
3
deny from 224.39.163.12
4
deny from 172.16.7.92
5
allow from all

302 (oder 307) Vorübergehend verschoben & 301 dauerhaft verschoben

Diese beiden Codes werden verwendet, um einen Browser umzuleiten. Wenn Sie beispielsweise einen URL-Kürzungsdienst wie bit.ly verwenden, werden die Personen, die auf ihre Links klicken, genau so weitergeleitet.

Sowohl 302 als auch 301 werden vom Browser sehr ähnlich behandelt, können jedoch für Suchmaschinen-Spider unterschiedliche Bedeutungen haben. Wenn Ihre Website beispielsweise wegen Wartungsarbeiten nicht verfügbar ist, können Sie mit 302 an einen anderen Ort umleiten. Der Suchmaschinen-Spider wird Ihre Seite später in der Zukunft weiter überprüfen. Wenn Sie jedoch mit 301 umleiten, wird dem Spider mitgeteilt, dass Ihre Website dauerhaft an diesen Ort verschoben wurde. Um Ihnen eine bessere Vorstellung zu geben: http://www.nettuts.com leitet zu https://net.tutsplus.com/ weiter einen 301-Code anstelle von 302 verwenden.

500 Interner Serverfehler

Dieser Code wird normalerweise angezeigt, wenn ein Webskript abstürzt. Die meisten CGI-Skripte geben im Gegensatz zu PHP keine Fehler direkt an den Browser aus. Bei schwerwiegenden Fehlern wird nur ein 500-Statuscode gesendet. Und der Programmierer muss dann die Server-Fehlerprotokolle durchsuchen, um die Fehlermeldungen zu finden.

Vollständige Liste

Die vollständige Liste der HTTP-Statuscodes mit ihren Erläuterungen finden Sie hier.

HTTP-Header in HTTP-Anfragen

Im Folgenden werden einige der gängigsten HTTP-Header in HTTP-Anfragen überprüft.

Fast alle diese Header finden sich im $_SERVER-Array in PHP. Sie können auch die Funktion getallheaders() verwenden, um alle Header auf einmal abzurufen.

Host

Eine HTTP-Anfrage wird an eine bestimmte IP-Adresse gesendet. Da die meisten Server jedoch mehrere Websites unter derselben IP hosten können, müssen sie wissen, nach welchem Domainnamen der Browser sucht.

1
Host: net.tutsplus.com

Dies ist im Grunde der Hostname, einschließlich der Domäne und der Subdomäne.

In PHP kann es als $_SERVER['HTTP_HOST'] oder $_SERVER['SERVER_NAME'] gefunden werden.

User-Agent

1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

Dieser Header kann mehrere Informationen enthalten, wie zum Beispiel:

  • Browsername und -version.
  • Name und Version des Betriebssystems.
  • Standardsprache.

Auf diese Weise können Websites bestimmte allgemeine Informationen über die Systeme ihrer Surfer sammeln. Sie können beispielsweise erkennen, ob der Surfer einen Handy-Browser verwendet und ihn auf eine mobile Version ihrer Website umleiten, die mit niedrigen Auflösungen besser funktioniert.

In PHP kann es gefunden werden mit: $_SERVER['HTTP_USER_AGENT'].

1
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
2
	echo "Please stop using IE6!";
3
}

Accept-Language

1
Accept-Language: en-us,en;q=0.5

In dieser Kopfzeile wird die Standardspracheinstellung des Benutzers angezeigt. Verfügt eine Website über unterschiedliche Sprachversionen, kann sie anhand dieser Daten einen neuen Surfer umleiten.

Es kann mehrere Sprachen enthalten, die durch Kommas getrennt sind. Die erste ist die bevorzugte Sprache, und jede andere aufgeführte Sprache kann einen "q"-Wert tragen, der eine Schätzung der Präferenz des Benutzers für die Sprache ist (min. 0 max. 1).

In PHP kann es gefunden werden als: $_SERVER["HTTP_ACCEPT_LANGUAGE"].

1
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
2
	header('Location: http://french.mydomain.com');
3
}

Accept-Encoding

1
Accept-Encoding: gzip,deflate

Die meisten modernen Browser unterstützen gzip und senden dies im Header. Der Webserver kann dann die HTML-Ausgabe in einem komprimierten Format senden. Dadurch kann die Größe um bis zu 80% reduziert werden, um Bandbreite und Zeit zu sparen.

In PHP kann es gefunden werden als: $_SERVER["HTTP_ACCEPT_ENCODING"]. Wenn Sie jedoch die Callback-Funktion ob_gzhandler() verwenden, wird dieser Wert automatisch überprüft, sodass Sie dies nicht tun müssen.

1
// enables output buffering

2
// and all output is compressed if the browser supports it

3
ob_start('ob_gzhandler');

If-Modified-Since

Wenn ein Webdokument bereits in Ihrem Browser zwischengespeichert ist und Sie es erneut besuchen, kann Ihr Browser überprüfen, ob das Dokument aktualisiert wurde, indem er dies sendet:

1
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

Wenn es seit diesem Datum nicht geändert wurde, sendet der Server einen "304 Not Modified"-Antwortcode und keinen Inhalt - und der Browser lädt den Inhalt aus dem Cache.

In PHP kann es gefunden werden als: $_SERVER['HTTP_IF_MODIFIED_SINCE'].

1
// assume $last_modify_time was the last the output was updated

2
3
// did the browser send If-Modified-Since header?

4
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
5
6
	// if the browser cache matches the modify time

7
	if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
8
9
		// send a 304 header, and no content

10
		header("HTTP/1.1 304 Not Modified");
11
		exit;
12
	}
13
14
}

Es gibt auch einen HTTP-Header namens Etag, der verwendet werden kann, um sicherzustellen, dass der Cache aktuell ist. Wir werden in Kürze darüber sprechen.

Cookie

Wie der Name schon sagt, werden die in Ihrem Browser für diese Domain gespeicherten Cookies gesendet.

1
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

Dies sind Name=Wert-Paare, die durch Semikolons getrennt sind. Cookies können auch die Sitzungs-ID enthalten.

In PHP kann mit dem Array $_COOKIE auf einzelne Cookies zugegriffen werden. Sie können mit dem Array $_SESSION direkt auf die Sitzungsvariablen zugreifen, und wenn Sie die Sitzungs-ID benötigen, können Sie anstelle des Cookies die Funktion session_id() verwenden.

1
echo $_COOKIE['foo'];
2
// output: bar

3
echo $_COOKIE['PHPSESSID'];
4
// output: r2t5uvjq435r4q7ib3vtdjq120

5
session_start();
6
echo session_id();
7
// output: r2t5uvjq435r4q7ib3vtdjq120

Referer

Wie der Name schon sagt, enthält dieser HTTP-Header die verweisende URL.

Wenn ich beispielsweise die Nettuts+-Homepage besuche und auf einen Artikellink klicke, wird dieser Header an meinen Browser gesendet:

1
Referer: https://net.tutsplus.com/

In PHP ist es als $_SERVER['HTTP_REFERER'] zu finden.

1
if (isset($_SERVER['HTTP_REFERER'])) {
2
3
	$url_info = parse_url($_SERVER['HTTP_REFERER']);
4
5
	// is the surfer coming from Google?

6
	if ($url_info['host'] == 'www.google.com') {
7
8
		parse_str($url_info['query'], $vars);
9
10
		echo "You searched on Google for this keyword: ". $vars['q'];
11
12
	}
13
14
}
15
// if the referring url was:

16
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9

17
// the output will be:

18
// You searched on Google for this keyword: http headers

Sie haben vielleicht bemerkt, dass das Wort "Referrer" falsch als "Referer" geschrieben ist. Leider wurde es so in die offiziellen HTTP-Spezifikationen aufgenommen und blieb hängen.

Authorization

Wenn eine Webseite nach Autorisierung fragt, öffnet der Browser ein Anmeldefenster. Wenn Sie in diesem Fenster einen Benutzernamen und ein Kennwort eingeben, sendet der Browser eine weitere HTTP-Anfrage, die diesmal jedoch diesen Header enthält.

1
Authorization: Basic bXl1c2VyOm15cGFzcw==

Die Daten im Header sind base64-codiert. base64_decode('bXl1c2VyOm15cGFzcw==') würde beispielsweise 'myuser:mypass' zurückgeben.

In PHP sind diese Werte als $_SERVER['PHP_AUTH_USER'] und $_SERVER['PHP_AUTH_PW'] zu finden.

Mehr dazu, wenn wir über den WWW-Authenticate-Header sprechen.

HTTP-Header in HTTP-Antworten

Jetzt werden wir uns einige der häufigsten HTTP-Header ansehen, die in HTTP-Antworten zu finden sind.

In PHP können Sie Antwortheader mit der Funktion header() setzen. PHP sendet bereits automatisch bestimmte Header, um den Inhalt zu laden und Cookies zu setzen etc... Sie können die gesendeten oder gesendeten Header mit der Funktion headers_list() anzeigen. Sie können mit der Funktion headers_sent() überprüfen, ob die Header bereits gesendet wurden.

Cache-Control

Definition von w3.org: "Das Cache-Control-General-Header-Feld wird verwendet, um Anweisungen anzugeben, die von allen Caching-Mechanismen entlang der Anforderungs-/Antwortkette befolgt werden MÜSSEN." Diese "Caching-Mechanismen" umfassen Gateways und Proxys, die Ihr ISP möglicherweise verwendet.

Beispiel:

1
Cache-Control: max-age=3600, public

"öffentlich" bedeutet, dass die Antwort von jedem zwischengespeichert werden kann. "max-age" gibt an, für wie viele Sekunden der Cache gültig ist. Wenn Sie das Zwischenspeichern Ihrer Website zulassen, können Sie die Serverlast und -bandbreite reduzieren und auch die Ladezeiten des Browsers verbessern.

Caching kann auch mit der Direktive "no-cache" verhindert werden.

1
Cache-Control: no-cache

Ausführlichere Informationen finden Sie unter w3.org.

Content-Type

Dieser Header gibt den "Mime-Typ" des Dokuments an. Auf dieser Grundlage entscheidet der Browser, wie die Inhalte interpretiert werden. Beispielsweise kann eine HTML-Seite (oder ein PHP-Skript mit HTML-Ausgabe) Folgendes zurückgeben:

1
Content-Type: text/html; charset=UTF-8

"text" ist der Typ und "html" ist der Untertyp des Dokuments. Der Header kann auch weitere Informationen wie Zeichensatz enthalten.

Für ein Gif-Bild kann dies gesendet werden.

1
Content-Type: image/gif

Der Browser kann basierend auf dem Mime-Typ entscheiden, eine externe Anwendung oder Browsererweiterung zu verwenden. Dadurch wird beispielsweise der Adobe Reader geladen:

1
Content-Type: application/pdf

Beim direkten Laden kann Apache normalerweise den Mime-Typ eines Dokuments erkennen und den entsprechenden Header senden. Außerdem haben die meisten Browser eine gewisse Fehlertoleranz und automatische Erkennung der Mime-Typen, falls die Header falsch oder nicht vorhanden sind.

Eine Liste gängiger Mime-Typen finden Sie hier.

In PHP können Sie die Funktion finfo_file() verwenden, um den Mime-Typ einer Datei zu erkennen.

Content-Disposition

Dieser Header weist den Browser an, eine Datei-Download-Box zu öffnen, anstatt zu versuchen, den Inhalt zu analysieren. Beispiel:

1
Content-Disposition: attachment; filename="download.zip"

Das führt dazu, dass der Browser dies tut:

Beachten Sie, dass auch der entsprechende Content-Type-Header mit gesendet werden sollte:

1
Content-Type: application/zip
2
Content-Disposition: attachment; filename="download.zip"

Content-Length

Bei der Übertragung von Inhalten an den Browser kann der Server anhand dieses Headers deren Größe (in Bytes) angeben.

1
Content-Length: 89123

Dies ist besonders nützlich für Datei-Downloads. So kann der Browser den Fortschritt des Downloads feststellen.

Hier ist zum Beispiel ein von mir geschriebenes Dummy-Skript, das einen langsamen Download simuliert.

1
// it's a zip file

2
header('Content-Type: application/zip');
3
// 1 million bytes (about 1megabyte)

4
header('Content-Length: 1000000');
5
// load a download dialogue, and save it as download.zip

6
header('Content-Disposition: attachment; filename="download.zip"');
7
8
// 1000 times 1000 bytes of data

9
for ($i = 0; $i < 1000; $i++) {
10
	echo str_repeat(".",1000);
11
12
	// sleep to slow down the download

13
	usleep(50000);
14
}

Das Ergebnis ist:

Jetzt werde ich den Content-Length-Header auskommentieren

1
// it's a zip file

2
header('Content-Type: application/zip');
3
// the browser won't know the size

4
// header('Content-Length: 1000000');

5
// load a download dialogue, and save it as download.zip

6
header('Content-Disposition: attachment; filename="download.zip"');
7
8
// 1000 times 1000 bytes of data

9
for ($i = 0; $i < 1000; $i++) {
10
	echo str_repeat(".",1000);
11
12
	// sleep to slow down the download

13
	usleep(50000);
14
}

Das Ergebnis ist nun:

Der Browser kann Ihnen nur sagen, wie viele Bytes heruntergeladen wurden, aber er kennt nicht die Gesamtmenge. Und der Fortschrittsbalken zeigt den Fortschritt nicht an.

Etag

Dies ist ein weiterer Header, der für Caching-Zwecke verwendet wird. Es sieht aus wie das:

1
Etag: "pub1259380237;gz"

Der Webserver kann diesen Header mit jedem bereitgestellten Dokument senden. Der Wert kann auf dem letzten Änderungsdatum, der Dateigröße oder sogar dem Prüfsummenwert einer Datei basieren. Der Browser speichert diesen Wert dann beim Zwischenspeichern des Dokuments. Wenn der Browser das nächste Mal dieselbe Datei anfordert, sendet er dies in der HTTP-Anfrage:

1
If-None-Match: "pub1259380237;gz"

Wenn der Etag-Wert des Dokuments damit übereinstimmt, sendet der Server einen 304-Code anstelle von 200 und keinen Inhalt. Der Browser lädt den Inhalt aus seinem Cache.

Last-Modified

Wie der Name schon sagt, zeigt diese Kopfzeile das letzte Änderungsdatum des Dokuments im GMT-Format an:

1
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
1
$modify_time = filemtime($file);
2
3
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");

Es bietet dem Browser eine weitere Möglichkeit, ein Dokument zwischenzuspeichern. Der Browser kann dies in der HTTP-Anfrage senden:

1
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

Darüber haben wir bereits früher im Abschnitt "Wenn-Modified-Seit" gesprochen.

Location

Dieser Header wird für Umleitungen verwendet. Wenn der Antwortcode 301 oder 302 lautet, muss der Server auch diesen Header senden. Wenn Sie beispielsweise http://www.nettuts.com aufrufen, empfängt Ihr Browser dies:

1
HTTP/1.x 301 Moved Permanently
2
...
3
Location: https://net.tutsplus.com/
4
...

In PHP können Sie einen Surfer wie folgt umleiten:

1
header('Location: https://net.tutsplus.com/');

Standardmäßig wird ein 302-Antwortcode gesendet. Wenn Sie stattdessen 301 senden möchten:

1
header('Location: https://net.tutsplus.com/', true, 301);

Set-Cookie

Wenn eine Website ein Cookie in Ihrem Browser setzen oder aktualisieren möchte, verwendet sie diesen Header.

1
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
2
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT

Jedes Cookie wird als separater Header gesendet. Beachten Sie, dass die über JavaScript gesetzten Cookies keine HTTP-Header durchlaufen.

In PHP können Sie Cookies mit der Funktion setcookie() setzen, und PHP sendet die entsprechenden HTTP-Header.

1
setcookie("TestCookie", "foobar");

Dadurch wird dieser Header gesendet:

1
Set-Cookie: TestCookie=foobar

Wird das Ablaufdatum nicht angegeben, wird das Cookie beim Schließen des Browserfensters gelöscht.

WWW-Authenticate

Eine Website kann diesen Header senden, um einen Benutzer über HTTP zu authentifizieren. Wenn der Browser diese Kopfzeile sieht, öffnet er ein Login-Dialogfenster.

1
WWW-Authenticate: Basic realm="Restricted Area"

Welches sieht so aus:

Es gibt einen Abschnitt im PHP-Handbuch, der Codebeispiele enthält, wie man dies in PHP macht.

1
if (!isset($_SERVER['PHP_AUTH_USER'])) {
2
    header('WWW-Authenticate: Basic realm="My Realm"');
3
    header('HTTP/1.0 401 Unauthorized');
4
    echo 'Text to send if user hits Cancel button';
5
    exit;
6
} else {
7
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
8
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
9
}

Content-Encoding

Dieser Header wird normalerweise gesetzt, wenn der zurückgegebene Inhalt komprimiert wird.

1
Content-Encoding: gzip

Wenn Sie in PHP die Callback-Funktion ob_gzhandler() verwenden, wird diese automatisch für Sie gesetzt.

Abschluss

Danke fürs Lesen. Ich hoffe, dieser Artikel war ein guter Ausgangspunkt, um mehr über HTTP-Header zu erfahren. Bitte hinterlassen Sie Ihre Kommentare und Fragen unten, und ich werde versuchen, so viel wie möglich zu beantworten.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.