Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard HTTP Header

 

Inhalte

Einführung


Das Hypertext Transfer Protocol (kurz HTTP; engl. für "querverweisendes Übertragungsprotokoll") wird eingesetzt um HTML-Seiten über das Internet von A nach B zu schicken. Obwohl "Hypertext" als Namensgebung dient, ist das Protokoll nicht auf HTML begrenzt; genauer gesagt kann jede Form von Daten über dieses Protokoll übertragen werden.

Gesendet werden die Daten über TCP und Port 80 bzw 443 für gesicherte Verbindungen (https). HTTP ist ein verbindungsorientiertes (TCP) aber zustandloses Protokoll. Das Protokoll verläuft stehts nach dem Anfrage-Antwort-Prinzip. Für jede Anfrage wird eine neue Verbindung eingerichtet (HTTP/1.0). In HTTP/1.1 kann festgesetzt werden, dass mehere Anfragen über nur eine Verbindung geschickt werden können. Dieses Vorhaben spart Daten und Zeit.
HTTP wurde so konstruiert, dass es ein Mensch lesen und verstehen kann. Das Protokoll beschreibt stets den selben Weg der Datenübertragung:

 
Header-BlockLeerzeile
Daten-Block (Body)

Der Datenblock ist optional, die Leerzeile hingegen erforderlich.
Hinweis: In diesem Artikel ist unter Zeilenumbruch \r\n und Leerzeile r\n\r\n zu verstehen.

Ein typisches Beispiel einer Anfrage eines Clients an einem Server wegen einer Webseite:

Client: (Anfrage/Request)
GET /forum/showthread.php?t=21098 HTTP/1.1
Host: phpforum.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.4)
Accept: text/html
Accept-Language: de-de
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: bblastvisit=1223150529

Server: (Antwort/Answer)HTTP/1.1 200 OK
Date: Fri, 05 Dec 2008 11:43:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.5
Set-Cookie: vbbuserid=deleted; expires=Thu, 06-Dec-2007 11:43:57 GMT; path=/
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html;charset=utf-8
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://ww ...

Wie man sieht ist HTTP in Version 1.1 ziemlich angewachsen und übermittelt viele Informationen. Jedoch ist HTTP abwärtskompatibel. Möchte der Client nur HTTP in Version 1.0 benutzen, so teilt dieser dies den Server in der ersten Zeile mit.

Der Client übermittelt in der ersten Zeile ebenfalls die Art der Methode, die er nutzen möchte. Direkt daran die URI, die er erhalten möchte zb /forum/showthread.php?t=21098 (Jedoch mit Leerzeichen als Abgrenzung). Danach folgen Header, die Informationen beinhalten für den Server.

Der Server antwortet mit der gewünschten Protokollversion und einem Statuscode, der den weiteren Verarbeitungsablauf bestimmt. Folgend von einem für einen Menschen verständlichen Wortlaut und Header, die nun für den Client bestimmt sind.

Das q= gibt einen Bereich von 0.0 - 1.0 an. Darunter ist eine Prozentangabe zu verstehen. Dies wird angewendet, wenn zu einer Ressource Sub-Typen existieren. Ein Sub-Typ wäre zB das gleiche Dokument in einer anderen Sprache oder andere Kodierung. Der Client kann somit angeben, was er mehr bevorzugt, wenn er dem jeweiligen Sub-Typ einen höheren Wert gibt, als den anderen.

Methoden


Das Protokoll kennt mehrere Methoden. Diese sendet nur der Anfrage-Steller.

GET

Mit diesem Wort wird der Server angewiesen eine Ressource (dies kann eine statische Seite, ein Bild oder anderes Medium oder auch eine URI sein, welche auf ein Script zeigt, dass dynamische Daten erzeugt) auszugeben. Der Server schickt bei Erfolg die angeforderte Ressource zu. Jede eingetippte URI in der Adresseleiste des Browsers wird auf diese Weise aufgerufen.

POST

Genau wie GET, jedoch können hier Daten im Datenblock mitgesendet werden. Dies ist die Standard-Methode für Formulardaten eines HTML-Formulars. Siehe Praxisbeispiele für den schematischen Aufbau einer POST-Transaktion.

PUT

Diese Methode ist veraltet und diente ursprünglich dazu, Daten auf dem Server abzulegen/hochzuladen. Wenn der Browser und Server die Methode unterstützt kann diese aber in PHP weiterhin verwendet werden.

HEAD

Auch diese Methode ist GET ähnlich, jedoch wird kein Datenblock vom Server gesendet. Diese Methode eignet sich zB um zu überprüfen, ob eine Datei am Server existiert, man diese aber nicht sofort erhalten möchte.

DELETE

Diente dazu, eine von PUT-gelegte Ressource wieder zu löschen.

TRACE

Ein Debugging-Befehl. Der Server liefert hierauf die Anfrage so zurück, wie er diese empfangen hat.

OPTIONS

Kann dazu genutzt werden, um verfügbare Methoden und andere Features des Servers zu erhalten.

Es existieren noch weitere Methoden, die aber kaum von Relevanz und nur mit entsprechenden Modulen verfügbar sind. (zB WebDAV)

Header


Informationen, die Client und Server benötigen, werden durch Header gekennzeichnet:

Client

sendet Client
Accept: text/htmlDer Server soll die am ehesten passende Ressource liefern, die dem gewünschten Typ entspricht (MIME-Typ).

Accept-Charset: utf-8Erwünschte Zeichenkodierung.

Accept-Encoding: gzip,deflateMögliche Datenkodierung, wie zB Kompression.

Accept-Language: deGewünschte Sprache.

Accept-Range: bytesGewünschte Methode, um einen Teilbereich einer Ressource anzufordern. Definiert sind nur "none" und "bytes".

Authorization: basic:[Data]Übermittelt eine gehashte (s. Kryptographie) Zugangskennung bei Passwort-geschützen Seiten.

Connection: keep-aliveBeschreibt, ob eine Verbindung mehrfach genutzt werden soll, oder sofort geschlossen werden soll, nach Übermittlung der Daten. Mögliche Werte sind "keep-alive" und "close".

Content-Length: 234Die Angabe in Bytes über die Länge der gesendeten Ressource. In der Regel nur bei POST genutzt.

Cookie: [DATA]Wurde im Browser ein Cookie gesetzt wird dieses nun an den Server zurückübermittelt, falls die Domain bzw der Pfad übereinstimmt.

Date: Sat, 29 Oct 1994 19:43:31 GMTHiermit kann das Datum und aktuelle Zeit dem Server übermittelt werden. Dies ist notwendig, falls eine Anfrage mit Zeitbegrenzung oder sonstiger Information mit einer Zeitangabe gesendet wird um den evtl. Zeitunterschied berechnen zu können.

Host: phpforum.deDa sich auf einer IP-Adresse mehere Domains befinden können, muss spezifiziert werden, welche Domain man erreichen möchte.

If-Modified-Since: Sat, 29 Oct 2008 19:43:31 GMTHiermit kann der Server angewiesen werden einen Datenblock nur zurückzuliefern, falls das Dokument nach diesem Zeitpunkt modifiziert wurde.

If-None-Match: 92defa12...Übermittelt einen Hash (s. Kryptographie), um festzustellen, ob die Datei modifiziert wurde.

Referer: phpforum.de/forum/?blaKlickt man im Browser auf einen Link wird dem Linkziel im Referer die Seite oder Ressource übermittelt, die den Link aufgerufen hat. Der Referer kann verfälscht sein.

User-Agent: myOwnAgent/1.0Dem Server wird auf diese Weise der verwendete Browser und Version übermittelt. Auf diese Weise kann der Server Vorkehrungen treffen, um ein Dokument oder Ressource so aufzubereiten, dass es der Browser best-möglich verarbeiten kann.

Server

sendet Server
Accept-Range: bytesDer Server unterstützt die Range-Methode und akzeptiert davon folgende: bytes.

Age: 30Diese Information ist für Proxy-Server interessant. Sie weist den Proxy an, das Dokument x Sekunden lang im Cache zu halten und erst dann das Dokument neu anzufordern.

Allow: HEAD, GET, POSTDer Server übermittelt Methoden die er annimmt und verarbeitet.

Cache-Control: no-cacheÜbermittelt die Einstellungen für das Caching von Daten. Wird von Proxies und Browsern gleichermaßen implementiert.

Content-Encoding: gzipWerden Daten zb einer Kompression unterworfen, so muss dieses Header gesendet werden, damit die Daten im Browser richtig interpretiert werden.

Content-Language:de-deDie Sprache der angeforderten Ressource.

Content-Length: 234Die Angabe in Bytes über die Länge der angeforderten Ressource. Die Ressource kann auch geteilt sein (durch Range). Ist dies der Fall, so wird stets die Größe des aktuellen Teilstücks übertragen.

Content-Location: /index2.htmDieser Header wird genutzt, wenn zu einem Inhalt ein alternativer existiert.

Content-Disposition: attachment; filename=file1Der Header ist eigentlich nicht im RFC2616 definiert. Er ist kein Bestandteil des HTTP-Protokolls und sollte daher mit Vorsicht verwendet werden. Die Browser implementieren diesen jedoch, da er zur MIME-Typen-Definition gehört. Er bewirkt bei den meisten Browsern einen Download-Dialog zu öffnen.

Content-MD5: 29d238a9de71f...Ein MD5-Hash der übertragenen Daten, um Übertragungsfehler feststellen zu können.

Content-Range: bytes 3432-17021/17022Gibt an, dass nur die Bytes von 3432-17021 übertragen werden von Gesamt 17022.

Content-Type: text/htmlDer MIME-Typ der angeforderten Ressource.

Date: Sat, 29 Oct 1994 19:43:31 GMTHiermit kann das Datum und aktuelle Zeit dem Server übermittelt werden. Dies ist notwendig, falls eine Anfrage mit Zeitbegrenzung oder sonstiger Information mit einer Zeitangabe gesendet wird um den evtl. Zeitunterschied berechnen zu können.

ETag: 37128d28e...Ein Hash der aktuellen Ressource, wie Content-MD5. Dient hier jedoch nur zum Speichern für die aktuelle Datei. Wird für If-None-Match genutzt.

Expires: Thu, 01 Dec 2008 22:00:00 GMTBeschreibt einfach, wann die angeforderte Ressource ungültig wird und neu geladen werden sollte.

Last-Modified: Thu, 01 Dec 1994 16:00:00 GMTDas Datum der letzten Änderung der Datei.

Location: http://www.google.deEine Weiterleitung zu einer anderen Ressource. Akzeptiert nur einen vollständigen (absoluten) URL oder URI. Relative Pfade sind nicht erlaubt.

Server: Apache/2.0.1Name und Version oder sonstige Informationen über den Server.

Set-Cookie: vbbuserid=deleted;Setzt ein Cookie beim Client. Die Angaben von expires und path sind optional.

Transfer-Encoding: chunkedHiermit gibt der Server bekannt, dass die Daten in einem bestimmten Modus geliefert werden. Im Fall chunked bedeutet dies zerstückelt. Das bedeutet, die Ressource wird nur in Teilen ausgeliefert. Wird dieser Header gesendet, muss man in einem Script darauf reagieren. Denn ein Chunk ist eine Hex-Zahl (welche die Länge der Daten des Teils angibt) gefolgt von einem Zeilenumbruch und den eigentlichen Daten.

X-Powered-By: php/5.2.6Eine Information an den Client, dass der Inhalt dynamisch durch ein Script generiert wurde. Auch dieser Header ist kein Bestandteil des HTTP.

Status-Codes


Diese Codes werden nur vom Server vergeben. Viele Codes sind für den "täglichen Gebrauch" kaum von Relevanz, daher werden hier nur die wichtigsten aufgelistet. Zum einfacheren Verständis sind die Codes wie folgt aufgeteilt:

1xx - Information


100 Continue

Der Server sendet diesen Code, wenn der Client eine große Anfrage in kleinere Teilanfragen geteilt hat. Hat der Server den Teil der Anfrage akzeptiert, wird dieser Code gesendet.
2xx - Erfolg

200 OK
Die Anfrage wurde verarbeitet und der Server sendet das Ergebnis.

204 No Content
Die Anfrage wurde verarbeitet, jedoch gibt es keine Daten auszugeben. Mit diesem Header kann erreicht werden, dass ein Browser die Seite nicht neulädt, obwohl er durch ein Formular oder Refresh dazu gezwungen wird.

206 Partial Content
Der Server teilt dem Client mit, dass nicht die gesamte Ressource geliefert wird, sondern nur ein Teil. Dies ist nicht mit Transfer-Encoding: chunked zu verwechseln. Bei Partial Content wird nur der Teil (Bytes von - bis) zurückgegeben, den der Client angefordert hat.
3xx - Umleitung

301 Moved Permanently

Hiermit übergibt der Server zusammen mit dem Location-Header die neue Adresse der Ressource, da die alte nicht mehr gültig ist. Der Client hat die alte Adresse von nun an nicht mehr aufzurufen.

302 Found
Ebenfalls eine Umleitung wie 301, jedoch ist diese nur temporär zu betrachten.

304 Not Modified
Die Ressource wurde gefunden, wird jedoch nicht ausgegeben, da sich der Zustand nicht geändert hat. Dies spart Traffic.

307 Temporary Redirect
Praktisch mit 302 gleichzusetzen. Sollte in HTTP/1.1 statt 302 verwendet werden.
4xx - Client-Fehler

400 Bad Request
Die Anfrage war fehlerhaft und muss neu gestellt werden.

401 Unauthorized
Dies ist ein geschützter Bereich. Der Zugriff ist nicht ohne Kenndaten erlaubt.

403 Forbidden
Diese Aktion ist unter keinen Umständen erlaubt.

404 Not Found
Die Ressource wurde nicht gefunden.

410 Gone

Die Ressource wurde entfernt und steht nicht mehr zur Verfügung.
5xx - Server-Fehler

500 Internal Server Error
Die Anfrage wurde akzeptiert, bei der Verarbeitung trat aber ein interner Fehler auf.

Praxisbeispiele


Der POST-Ablauf


Beim Absenden eines Formulars kann die Methode als POST festgesetzt werden. Dies hat den Vorteil, dass man im Body Daten übergeben kann. Prinzipiell können mit GET und POST die gleichen Daten übertragen werden. GET hat jedoch eine Begrenzung in der Länge der Daten. Ausserdem ist jeder Linkaufruf ein GET-Aufruf. Man könnte also durch zB den Referer an Formulardaten gelangen, weshalb man POST benutzen sollte.

Ein typisches Formular

HTML Quellcode:
<form accept-charset="utf-8" action="index.php?machwas=ja" method="post" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="var" value="Änderung" />
<input type="hidden" name="var2" value="wert" />
<input type="submit" value="send"/></form>
Wird beim Absenden folgend übertragen:

 
POST /index.php?machwas=ja HTTP/1.1
Host: whatever.tld
User-Agent: myOwnAgent/1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: whatever.tld/test.htm
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
var=%C3%83%E2%80%9Enderung&var2=wert

Die Post-Daten werden also in einer Zeile, wie eine URI übertragen. Das Ä wird durch die UTF-8-Kodierung entsprechend kodiert.

In PHP wird auf die Variable mit dem _POST-Array zugegriffen, aber auch der GET-Wert kann abgerufern werden, durch das _GET-Array - obwohl die Methode nicht GET ist.
PHP Quellcode:
echo $_POST['var'];
//Änderung
Manchmal ist es erforderlich auf die POST-Daten direkt zuzugreifen. Man kann jedes einzelne Zeichen wie im grünen Bereich dargestellt, abfragen. PHP stellt hierfür eine Variable bereit:
PHP Quellcode:
echo $HTTP_RAW_POST_DATA;
//var=%C3%83%E2%80%9Enderung&var2=wert

Header und Umleitungen mit PHP


Mit der Funktion header() kann jeder oben angeführte Header aber auch jeder Status-Code ausgegeben werden. Dabei werden Standard-Header überschrieben. Die header()-Funktion setzt automatisch den nötigen Zeilenumbruch.

PHP Quellcode:
header("HTTP/1.0 404 Not Found");
ist ebenso möglich wie
PHP Quellcode:
header("Content-Length: 320");
Pro Header-Aufruf darf immer nur 1 Header übergeben werden. Da wir nun das HTTP-Protokoll kennen wird klar, dass Header immer an erster Stelle ausgegeben werden müssen. (Ein Header im Body macht keinen Sinn mehr, da dieser nicht mehr interpretiert wird). Versucht man einen Header zu setzen, nachdem eine Ausgabe erfolgt ist, wird PHP einen Fehler werfen, da eine Ausgabe stets zum Body-Teil gehört.

Es ist zu beachten, dass bei einem Dokument - worin PHP-Code nur eingebettet wird - der HTML-Teil vor dem eingebetten PHP-Code ebenfalls schon Body-Daten sind. Ein Header-Aufruf wird daher im PHP-Teil fehlschlagen.

Möchte man eine Umleitung realisieren, kann man dies einfach mit header() tun:
PHP Quellcode:
header("Location: http://www.google.de");
Somit wird der Browser die URL von Google aufrufen. Das Script wird hierdurch aber nicht gestoppt, sondern läuft normal weiter.

Ausgabenpufferung


Mit Ausgabenpufferung wird die Ausgabe gepuffert. Dadurch können Header auch nachträglich noch gesetzt werden, bevor die Ausgabe erfolgt (der Buffer geleert wird).

Die Pufferung kann entweder dauerhaft in der php.ini aktiviert werden, oder durch die Laufzeit erfolgen, die Benutzung ist relativ einfach:
PHP Quellcode:
ob_start(); // startet die Pufferung

// echo, header(), HTML - hier ist alles erlaubt

$inhalt = ob_get_contents(); // hiermit wird der Pufferinhalt in $inhalt verbannt...

// und so wird die Pufferung beendet und verworfen
// ab hier werden die Header aber gesetzt
ob_end_clean();

echo $inhalt; // wann immer es beliebt kann der Inhalt ausgegeben werden

Download-Header


Für einen Download, welcher von einem Script initiiert wird, müssen spezielle Header gesendet, werden:
PHP Quellcode:
header("Content-Disposition: attachment; filename=" . urlencode($file));  
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");      
header("Content-Length: " . filesize($file));

$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
}
fclose($fp);

Links


HTTP/1.1 RFC 2616
http://de.php.net/manual/de/function.header.php

EVA Prinzip


Mitwirkende: combie, frameone
Erstellt von frameone, 06.12.2008 am 14:37
Zuletzt bearbeitet von combie, 20.12.2013 am 18:53
2 Kommentare , 10777 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
http, location header

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
http header auslesen Michael075 PHP 33 03.02.2008 12:07
Http Header Steven12 PHP 2 28.07.2005 11:02
HTTP Header löschen loki.larum PHP 3 01.07.2005 15:22
http header bei gzip toaster PHP 2 07.04.2005 17:39
Http-header auslesen istvan PHP 0 25.08.2004 11:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:56 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC